2016-11-09 114 views
5

的整數我有一個數據幀是這樣的:如何總結的nlargest()在GROUPBY

Index STNAME COUNTY COUNTY_POP 
     0  AL  0  100 
     1  AL  1  150 
     2  AL  3  200 
     3  AL  5  50 
    ... 
    15  CA  0  300 
    16  CA  1  200 
    17  CA  3  250 
    18  CA  4  350 

我要總結從COUNTY_POP三個最大的整數爲每個狀態。到目前爲止,我有:

In[]: df.groupby(['STNAME'])['COUNTY_POP'].nlargest(3) 
    Out[]: 
    Index STNAME COUNTY COUNTY_POP 
     0  AL  0  100 
     1  AL  1  150 
     2  AL  3  200 
    ... 
    15  CA  0  300 
    17  CA  3  250 
    18  CA  4  350 

但是,當我將.sum()操作添加到上述代碼時,我收到以下輸出。

In[]: df.groupby(['STNAME'])['COUNTY_POP'].nlargest(3).sum() 
    Out[]: 
    1350 

我是比較新的Python和熊貓。如果任何人都可以解釋是什麼原因造成的以及如何糾正它,我真的很感激!

回答

6

這就是你想要的嗎?

In [25]: df.groupby('STNAME')['COUNTY_POP'].agg(lambda x: x.nlargest(3).sum()) 
Out[25]: 
STNAME 
AL 450 
CA 900 
Name: COUNTY_POP, dtype: int64 
+0

這偉大的工作,@MaxU!謝謝。你能解釋.agg()和lambda的用法嗎? – IMLD

2

和預先分類片......稍快一點

df.sort_values('COUNTY_POP').groupby('STNAME').COUNTY_POP \ 
    .apply(lambda x: x.values[-3:].sum()) 

STNAME 
AL 450 
CA 900 
Name: COUNTY_POP, dtype: int64 
+3

這對於非常小的團體來說只會更快 - 這是最大的一點,它不需要排序 – Jeff

+0

@傑夫感謝您的澄清 – piRSquared