我有一个包含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()
不起作用。我该如何解决?
最重要的是,我想保留数据集中的所有列。
答案 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()]