Python Pandas Dataframe按组中的最大值选择行

时间:2015-09-08 13:37:20

标签: python pandas

我有一个通过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'过滤并返回一行,只返回带有Maximum'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

谢谢..

2 个答案:

答案 0 :(得分:30)

标准方法是使用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返回标签(而不是序数),因此总是使用idxmax更好使用df.loc,而不是df.iloc(正如我最初在此帖中所做的那样。)

答案 1 :(得分:1)

其他方法如下:

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