2016-11-09 5 views
5

ich einen Datenrahmen wie diese haben zusammenzufassen:Wie die nlargest() ganze Zahlen in 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 

ich die drei größten Zahlen von COUNTY_POP für jeden Staat summieren möchten. Bisher habe ich:

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 

Allerdings, wenn ich die .sum() Betrieb der obigen Code hinzufügen, ich erhalten die folgende Ausgabe.

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

Ich bin relativ neu zu Python und Pandas. Wenn jemand erklären könnte, was das verursacht und wie man es korrigiert, würde ich es wirklich schätzen!

Antwort

6

Wollen Sie das?

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

Das hat super funktioniert, @MaxU! Vielen Dank. Kannst du die Verwendung von .agg() und Lambda erklären? – IMLD

2

vorsortieren und in Scheiben schneiden ... ein bisschen schneller

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

das ist nur schneller für sehr kleine Gruppen - das ist der Punkt der größten es braucht nicht zu sortieren – Jeff

+0

@Jeff danke für die Klarstellung – piRSquared