在pandas中将“groupby”的最大值仅取为一列

时间:2017-08-03 13:19:21

标签: python pandas

我有一个包含10列的数据框:

id        date         value
1233     2014-10-3     1.123123
3412     2015-05-31    2.123123
3123     2015-05-31    5.6234234
3123     2013-03-21    5.6234222
3412     2014-11-21    4.776666
5121     2015-08-22    5.234234

我希望按id列进行分组,然后选择最新的date。但我不想采用value列的最大值。我想取这个行的值,它属于最大日期。

pd.groupby('id').max()不起作用。我该如何解决?

最重要的是,我想保留数据集中的所有列。

4 个答案:

答案 0 :(得分:5)

您可以使用布尔索引来选择组中的最大日期,并按组返回该行:

df.groupby('id').apply(lambda x: x.loc[x.date == x.date.max(),['date','value']])

或者,使用idxmax选择每个组中该最大值的索引:

df.groupby('id').apply(lambda x: x.loc[x.date.idxmax(),['date','value']]).reset_index()

输出:

     id       date     value
0  1233 2014-10-03  1.123123
1  3123 2015-05-31  5.623423
2  3412 2015-05-31  2.123123
3  5121 2015-08-22  5.234234

答案 1 :(得分:4)

或者您只需使用sort_value然后使用first

即可
df.sort_values(['date', 'value'], ascending=[False, True]).groupby('id').first()

Out[480]: 
           date     value
id                       
1233 2014-10-03  1.123123
3123 2015-05-31  5.623423
3412 2015-05-31  2.123123
5121 2015-08-22  5.234234

答案 2 :(得分:1)

您可以按日期排序,然后只保留每个ID的第一个外观。

df = df.sort_values('date', ascending=False)

most_recent = df.drop_duplicates('id', keep='first')

most_recent

Out: 
     id        date     value
0  5121  2015-08-22  5.234234
1  3412  2015-05-31  2.123123
2  3123  2015-05-31  5.623423
4  1233   2014-10-3  1.123123

答案 3 :(得分:0)

如果要返回包含最大日期的整行,您需要使用idxmax

result_row = df.iloc[df['date'].idxmax()]