【问题标题】:Python Pandas Dataframe select row by max value in groupPython Pandas Dataframe按组中的最大值选择行
【发布时间】:2015-09-08 13:37:20
【问题描述】:

我有一个通过 df.pivot 创建的数据框:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908140300    NaN    480
               20150908140600    NaN    120
               20150908143000  10743   8803
C              20150908140100    NaN   1715
               20150908140200    NaN   1062
               20150908141000    NaN    145
               20150908141500    418    NaN
               20150908141800    NaN    450
               20150908142900   1973   1499
               20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

我想为每个“F_TYPE”过滤并返回一行,只返回最大“to_date”的行。我想返回以下数据框:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908143000  10743   8803
C              20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

谢谢..

【问题讨论】:

  • F_Type 是列还是您的索引?我认为df.groupby('F_Type').max() 应该可以工作或df.groupby(df.index).max(),实际上我认为df.max(level=0) 应该可以工作

标签: python pandas


【解决方案1】:

标准方法是使用groupby(keys)[column].idxmax()。 但是,要使用idxmax 选择所需的行,您需要idxmax 来返回唯一索引值。获得唯一索引的一种方法是调用reset_index

groupby(keys)[column].idxmax() 获取索引值后,您可以使用df.loc 选择整行:

In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]: 
                       start    end
F_Type to_date                     
A      20150908143000    345    316
B      20150908143000  10743   8803
C      20150908143000  19522  16659
D      20150908143000    433     65
E      20150908143000   7290   7375
F      20150908143000      0      0
G      20150908143000   1796    340

注意:idxmax 返回索引标签,不一定是序数。使用reset_index 后,索引标签恰好也是序数,但由于idxmax 返回标签(不是序数),最好始终idxmaxdf.loc 结合使用,而不是df.iloc(正如我最初在这篇文章中所做的那样。)

【讨论】:

    【解决方案2】:

    其他方法如下:

    1. 如果您只希望每组最多一行。
    (
        df
        .groupby(level=0)
        .apply(lambda group: group.nlargest(1, columns='to_date'))
        .reset_index(level=-1, drop=True)
    )
    
    1. 如果您想获取等于每组最大值的所有行。
    (
        df
        .groupby(level=0)
        .apply(lambda group: group.loc[group['to_date'] == group['to_date'].max()])
        .reset_index(level=-1, drop=True)
    )
    

    【讨论】:

    • @AndrewRichards 是的,你是对的。那些是错别字。我改变了我原来的答案。感谢您的指点。
    • 使用这样的大括号很整洁,在我自己尝试之前,我一直认为这是一个错字或什么的。谢谢!
    猜你喜欢
    • 2023-01-04
    • 2019-12-05
    • 1970-01-01
    • 2018-06-08
    • 2017-12-17
    • 2017-12-07
    • 2020-05-21
    • 2021-11-26
    相关资源
    最近更新 更多