【问题标题】:Filter pandas Dataframe based on max values in a column根据列中的最大值过滤熊猫数据框
【发布时间】:2014-08-01 15:22:57
【问题描述】:

我有一个在索引中有重复值的 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 中解决这个问题有什么想法吗?

非常感谢您的宝贵时间 -

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    您可以在“产品 ID”上执行 groupby,然后在“销售”列上应用 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
    

    【讨论】:

    • 没有重复的类似解决方案:df.iloc[df.groupby('Product ID')['Sales'].idxmax().values.ravel()]
    • @TomAugspurger 实际上在没有drop_duplicates 的情况下也可以使用,我最初使用的是transform,但使用agg 也可以使用,并且不需要删除重复项。我会更新我的答案
    • @TomAugspurger 当我使用 transform 时,它试图将结果与原始 df 对齐,因此重复索引值,因为每个“产品 ID”都有多个“存储”行,这是为什么我有drop_duplicates 但我意识到这是不必要的,因为idxmax 的聚合函数可以正常工作
    猜你喜欢
    • 2020-08-08
    • 2016-08-31
    • 2020-08-16
    • 2021-12-01
    • 2013-06-09
    • 2020-05-05
    • 2014-12-27
    • 2016-05-07
    • 2019-12-09
    相关资源
    最近更新 更多