基于列中的最大值过滤pandas数据框

14
我有一个索引中带有重复值的DataFrame。我想将此数据集过滤,只显示每个索引的一个实例,方法是选择索引中不同列中最大值对应的行。例如,我的DataFrame如下所示:
df:
Product ID     Store     Sales
    1            A         50
    1            B        200
    1            C         20
    2            A        400
    2            B         10
    3            A        200
    4            A         50
    4            B        100
    4            C        500

我想把这些数据过滤成这样:

df2:

Product ID     Store     Sales
    1            B        200
    2            A        400
    3            A        200
    4            C        500
任何关于如何在pandas中最好地解决这个问题的想法?非常感谢您的时间。
1个回答

19

您可以按“产品ID”分组,然后在“销售”列上应用idxmax。这将创建一个具有最高值索引的系列。然后,我们可以使用这些索引值使用iloc索引到原始数据帧。

In [201]:

df.iloc[df.groupby('Product ID')['Sales'].agg(pd.Series.idxmax)]
Out[201]:
   Product_ID Store  Sales
1           1     B    200
3           2     A    400
5           3     A    200
8           4     C    500

1
无重复的类似解决方案:df.iloc[df.groupby('Product ID')['Sales'].idxmax().values.ravel()] - TomAugspurger
@TomAugspurger 实际上不需要使用 drop_duplicates,我最初使用的是 transform,但使用 agg 也可以,并且不需要删除重复项。我会更新我的答案。 - EdChum
@TomAugspurger 当我使用 transform 时,它试图将结果与原始 df 对齐,因此重复索引值,因为每个 'Product ID' 都有多个 'Store' 行,这就是为什么我需要 drop_duplicates,但我意识到这是不必要的,因为使用 idxmax 的聚合函数可以很好地工作。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接