2017-10-05 1 views
3

ich oft in pandas Dinge zu tun, am Ende wie folgt:Pandas GROUPBY und boolean Auswahl

s2 = s1.groupby(level=1).sum() 
s2 = s2[s2>25] 

In Worten, ich einig groupby Betrieb und will dann nur Ergebnisse halten, die eine Bedingung für das Ergebnis erfüllen.

Gibt es einen Weg in einer Linie zu tun? Genauer gesagt, ist es möglich, dies zu tun, ohne die Reihe zu erstellen und dann die Boolesche Auswahl in einem zweiten Schritt durchzuführen?

Antwort

3

.loc + lambda

Serise

df.groupby('name').a.sum().loc[lambda x: x>20] 
Out[492]: 
name 
Chn  84 
Fra 165 
Ind  71 

Datenrahmen

df.groupby('name').a.sum().to_frame().loc[lambda x: x['a']>20] 
Out[490]: 
     a 
name  
Chn 84 
Fra 165 
Ind 71 

Datainput

df=pd.DataFrame({'name':['Ind','Chn','SG','US','SG','US','Ind','Chn','Fra','Fra'],'a':[5,6,3,4,7,12,66,78,65,100]}) 
+0

Interessant, habe ich das vorher nicht gesehen. Gefunden die Dokumentation hier: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-callable – itzy

+0

@itzy cheers ~ :) – Wen

7

s1 Unter der Annahme ist ein pandas.Series

  1. Sie level zu pd.Series.sum
  2. pd.Series.compress passieren kann, ist praktisch

s2.sum(level=1).compress(lambda s: s.gt(25)) 

s1 Unter der Annahme ist ein pandas.DataFrame
Und dass es eine Spaltennamen 'col'

s.sum(level=1).query('col > 25') 
+0

Kompresse .... Danke, Pir ** 2, wurde hinzugefügt, dass zu meinem Toolkit. –

+0

Einen neuen Weg finden :-) – Wen

+3

Beide y'alls Antworten ließen einige verrückte Wissensbomben in dieser Frage fallen. (Y) –