2016-12-15 57 views
2

我有一个熊猫数据帧这样的总和前n个记录:熊猫:我们会根据每顶我记录的每个组

>>> 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() 

但返回所有最大值的总和。

我查找了我的问题的答案,但我没有完全得到正确的答案。

回答

5

groupby.nlargest(2)返回一系列具有多指标:

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 

在这里,无论是标识和原有的指标出现在返回系列。现在,如果你拿出总和,它将取得本系列中每个值的总和。但是,如果您应用级别= 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 
+0

谢谢,能否请您解释在此处执行的级别操作? – Barker