2015-07-27 12 views
7

Desidero contare l'occorrenza di una stringa in una colonna di dataframe panda raggruppata.panda conteggio della stringa di conteggio del gruppo su colonna

Si supponga Ho il seguente dataframe:

catA catB scores 
A  X  6-4 RET 
A  X  6-4 6-4 
A  Y  6-3 RET 
B  Z  6-0 RET 
B  Z  6-1 RET 

In primo luogo, voglio gruppo da catA e catB. E per ciascuno di questi gruppi voglio contare l'occorrenza di RET nella colonna scores.

Il risultato dovrebbe essere qualcosa di simile:

catA catB RET 
A  X  1 
A  Y  1 
B  Z  2 

Il raggruppamento da due colonne è facile: grouped = df.groupby(['catA', 'catB'])

Ma che cosa è il prossimo?

risposta

8

chiamata apply su colonna i 'punti' sull'oggetto groupby e utilizzare il vectorise str metodo contains, utilizzare questo per filtrare il group e chiamare count:

In [34]:  
df.groupby(['catA', 'catB'])['scores'].apply(lambda x: x[x.str.contains('RET')].count()) 

Out[34]: 
catA catB 
A  X  1 
     Y  1 
B  Z  2 
Name: scores, dtype: int64 

Per assegnare un uso colonna transform affinché l'aggregazione restituisce una serie con il suo indice allineato al df originale:

In [35]: 
df['count'] = df.groupby(['catA', 'catB'])['scores'].transform(lambda x: x[x.str.contains('RET')].count()) 
df 

Out[35]: 
    catA catB scores count 
0 A X 6-4 RET  1 
1 A X 6-4 6-4  1 
2 A Y 6-3 RET  1 
3 B Z 6-0 RET  2 
4 B Z 6-1 RET  2 
+0

questo è quindi memorizzato in modo permanente in una nuova colonna? in caso contrario, come può essere memorizzato come una nuova colonna? quello che voglio fare è che voglio solo visualizzare l'output, se il conteggio è maggiore di un certo numero. – beta

+0

come posso cercare due stringhe diverse? così str può contenere 'RET' o' ASDF'? quindi ho bisogno di una RegEx? – beta

+1

Usa 'x.str.contains ('RET | ASDF')' inoltre dovresti pubblicare il tuo intero requisito, aggiornare la tua domanda e mantenere la tua domanda su 1 problema per domanda invece di incrementare il tuo problema – EdChum