我有一个像这样的pandas数据框:
>>> df
id value
0 1 10
1 1 11
2 1 9
3 2 7
4 2 7
5 2 8
6 3 10
7 3 8
我希望根据前两个值的总和得到前两个id。 所以在这里,我应该得到这个:
id # value
0 1 # 11 + 10 = 21
1 3 # 10 + 8 = 18
我尝试使用:
df.groupby('id')['value'].nlargest(2).sum()
但是这会返回所有最大值的总和。
我找了一个问题的答案,但我找不到合适的答案。
答案 0 :(得分:5)
groupby.nlargest(2)
返回一个包含MultiIndex的系列:
df.groupby('id')['value'].nlargest(2)
Out:
id
1 1 11
0 10
2 5 8
3 7
3 6 10
7 8
Name: value, dtype: int64
此处,id和原始索引都出现在返回的Series中。现在,如果你得到总和,它将取这个系列中每个值的总和。但是,如果您在level = 0(或此MultiIndex的id部分)上应用总和,则它将仅分别获取每个ID的总和。
df.groupby('id')['value'].nlargest(2).sum(level=0)
Out:
id
1 21
2 15
3 18
Name: value, dtype: int64
现在,每个id都有两个最大值的总和。要查找本系列中最大的两个值,您需要再次调用nlargest
:
df.groupby('id')['value'].nlargest(2).sum(level=0).nlargest(2)
Out:
id
1 21
3 18
Name: value, dtype: int64