2017-10-05 3 views
3

Je finissent souvent par faire des choses comme ça dans pandas:pandas géants groupby et booléenne sélection

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

En d'autres termes, je fais une opération groupby et que vous souhaitez garder uniquement les résultats qui répondent à certaines conditions pour le résultat.

Y at-il un moyen de faire avec dans une ligne? Plus précisément, est-il possible de le faire sans créer la série et ensuite faire la sélection booléenne dans une seconde étape?

Répondre

3

.loc + lambda

Serise

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

dataframe

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

Intéressant, ne l'ai jamais vu auparavant. Trouvé la documentation ici: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-callable – itzy

+0

@itzy acclamations ~ :) – Wen

7

En supposant s1 est un pandas.Series

  1. Vous pouvez passer level à pd.Series.sum
  2. pd.Series.compress est pratique

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

En supposant s1 est un pandas.DataFrame
Et qu'il ya un nom de colonne 'col'

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

.... compress Merci, piR ** 2, a ajouté que ma boîte à outils. –

+0

Trouver une nouvelle façon :-) – Wen

+3

Les deux réponses de y'all ont lâché des bombes de connaissances folles dans cette question. (Y) –