我有一个数据框,其中一列中有多个值。我要确保对于数据框中的每个唯一列元素,我都有3个最新条目。
我有:
Group Date Value
A 10/1/2017 4.4
A 8/3/2017 9.2
A 5/3/2017 8.4
A 4/4/2017 4.4
B 12/1/2015 4.4
B 8/3/2015 9.2
B 5/4/2015 8.4
B 4/5/2015 4.4
我想要:
Group Date Value
A 10/1/2017 4.4
A 8/3/2017 9.2
A 5/3/2017 8.4
B 12/1/2015 4.4
B 8/3/2015 9.2
B 5/4/2015 8.4
日期是日期时间。在这篇文章中,我不知道该如何表示。
我可以使用以下代码来获取它:
new_df = pd.DataFrame()
for group in df['Group'].unique():
temp_df = df[df['Group'] == group]
temp_df = temp_df[0:3]
if new_df.empty:
new_df = temp_df
else:
new_df.append(temp_df)
还有更多的pythonic方法可以做到这一点吗?
谢谢。
答案 0 :(得分:2)
以下内容如何:
df.sort_values(by='Date', ascending=False).groupby('Group').head(3)
在我的小测试数据集上,它返回以下内容(我使用head(2)):
Group Date
1 c 2050-01-01
8 a 2032-02-03
0 a 2030-01-01
9 c 2029-01-01
10 b 2018-01-01
2 b 2017-02-03
并且您可以看到各个组的值不再很好地组合在一起。我们可以通过首先在“组”上然后在“日期”上排序来解决此问题:
df.sort_values(by=['Group', 'Date'], ascending=[True,False]).groupby('Group').head(3)
Group Date
8 a 2032-02-03
0 a 2030-01-01
10 b 2018-01-01
2 b 2017-02-03
1 c 2050-01-01
9 c 2029-01-01
答案 1 :(得分:2)
您可以将groupby
与nlargest
一起使用:
df.groupby(['Group'])['Date','Value'].apply(lambda x: x.nlargest(3,'Date'))
Date Value
Group
A 0 2017-10-01 4.4
1 2017-08-03 9.2
2 2017-05-03 8.4
B 4 2015-12-01 4.4
5 2015-08-03 9.2
6 2015-05-04 8.4