Ich wollte bedingte Zählung nach groupby
machen; B. nach Werten der Spalte A
gruppieren und dann innerhalb jeder Gruppe zählen, wie oft der Wert 5
in der Spalte B
erscheint.Bedingtes Zählen in Gruppen
Wenn ich dies für die gesamte DataFrame
tat, ist es nur len(df[df['B']==5])
. Also ich hoffte, ich könnte df.groupby('A')[df['B']==5].size()
tun. Aber ich denke, boolesche Indizierung funktioniert nicht innerhalb GroupBy
Objekte.
Beispiel:
import pandas as pd
df = pd.DataFrame({'A': [0, 4, 0, 4, 4, 6], 'B': [5, 10, 10, 5, 5, 10]})
groups = df.groupby('A')
# some more code
# in the end, I want to get pd.Series({0: 1, 1: 2, 6: 0})
Mit dem ersten Ansatz, verliere ich die Gruppen, in denen Die bedingte Anzahl ist Null (ich habe das Beispiel in der Frage aktualisiert, um es zu verdeutlichen). Ich weiß nicht, ob es leicht ist, es zu modifizieren, um damit fertig zu werden. Der zweite Ansatz funktioniert perfekt. – max
uh .. bei meinem DataFrame dauert der erste Ansatz 41 ms, der zweite dauert 10 s! Ich denke, es ist der erste Ansatz überhaupt, nur Nullen getrennt irgendwie zu behandeln. – max
@max Ich denke, die Zeitdifferenz steigt als 'df [df ['B'] == 5]' wird zu einer kleineren Teilmenge im gesamten Datenrahmen. Um mit Nullen umzugehen, können Sie die eindeutigen Elemente aus Spalte A mit 'a = df [" A "]. Unique()' erhalten und dann map mit dem ersten Ansatz verwenden: 'pd.Series (a, index = a) .map (df.loc [df ['B'] == 5] .groupby ('A'). size()). fillna (0) 'Natürlich kann es nicht so schnell sein wie der erste Ansatz, aber es sollte immer noch viel schneller als agg/lambda. – ayhan