2015-07-27 15 views
7

Ich möchte das Auftreten einer Zeichenfolge in einer gruppierten Pandas Dataframe Spalte zählen.Pandas groupby Anzahl Zeichenfolge Auftreten über Spalte

Angenommen ich folgende Datenrahmen haben:

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 

Zuerst möchte ich zu einer Gruppe von catA und catB. Und für jede dieser Gruppen möchte ich das Auftreten von RET in der Spalte scores zählen.

Das Ergebnis sollte wie folgt aussehen:

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

Die Gruppierung von zwei Spalten ist einfach: grouped = df.groupby(['catA', 'catB'])

Aber was kommt als nächstes?

Antwort

8

Anruf apply auf der Spalte ‚Noten‘ auf der groupby Objekt und verwenden die vectorize str Methode contains verwenden dies die group und rufen zu filtern 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 

als Spalten Verwendung zuzuweisen transform so dass Die Aggregation gibt eine Reihe mit ihrem Index zurück, der auf das ursprüngliche df ausgerichtet ist:

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

wird dies dann dauerhaft in einer neuen Spalte gespeichert? wenn nicht, wie kann es als neue Spalte gespeichert werden? was ich tun möchte, ist, dass ich nur die Ausgabe anzeigen möchte, wenn der Count größer als eine bestimmte Anzahl ist. – beta

+0

Wie kann ich nach zwei verschiedenen Saiten suchen? so kann str ''RET' oder' ASDF' enthalten? Dann brauche ich eine RegEx richtig? – beta

+1

Verwenden Sie 'x.str.contains ('RET | ASDF')' auch sollten Sie Ihre vollständige Anforderung, aktualisieren Sie Ihre Frage und halten Sie Ihre Frage auf 1 Problem pro Frage, anstatt Ihr Problem zu erhöhen – EdChum