Pandas groupby und filter
Habe ich dataframe:
df = pd.DataFrame({'ID':[1,1,2,2,3,3],
'YEAR' : [2011,2012,2012,2013,2013,2014],
'V': [0,1,1,0,1,0],
'C':[00,11,22,33,44,55]})
Möchte ich group by-ID, und markieren Sie die Zeile mit V = 0 in jeder Gruppe.
Diese scheint nicht zu funktionieren:
print(df.groupby(['ID']).filter(lambda x: x['V'] == 0))
Bekam eine Fehlermeldung:
TypeError: filter-Funktion zurückgegebene einer Serie, von der aber erwartet wird eine Skalare bool
Wie kann ich filter verwenden, um das Ziel zu erreichen? Danke.
BEARBEITEN:
Die Bedingung V variieren für jede Gruppe, z.B., könnte es sein, V==0 für die ID 1, V==1 ID 2, und diese Informationen können verfügbar sein, über einen anderen DF:
df = pd.DataFrame({'ID':[1,2,3],
'V': [0,1,0])
So, wie Sie Zeilen filtern innerhalb jeder Gruppe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke
groupby
ist nicht erforderlich, verwenden Sieboolean Indizierung
nur wenn müssen alle Zeilen, in denenV
ist0
:Aber wenn müssen wieder alle Gruppen, in denen mindestens ein Wert der Spalte
V
gleich0
hinzufügenany
, weil filter müssenTrue
oderFalse
für die Filterung aller Zeilen in der Gruppe:Besser für die Prüfung ist, ändern Sie die Spalte für
groupby
- Reihe mit2012
ist filtern, weil keineV==0
:V
mit dem Wert von einem anderen dataframedf = pd.DataFrame({'ID':[1,2,3], 'V': [0,1,0])
? Wenn es zu änderndf = pd.DataFrame({'ID':[1,2,3], 'V': [0,1,2])
es nicht die Rückkehr der letzten Gruppe, also die Ausgabe ist{'V': [0, 1, 1, 0], 'ID': [1, 1, 2, 2], 'C': [0, 11, 22, 33], 'YEAR': [2011, 2012, 2012, 2013]}
?print(df.groupby(['YEAR']).filter(lambda x: (x['V'] == "abc" or x['V'] == "xyz").any()))
|
nuror
(vergleichen von arrays) und fügen Sieparenthesses
-print(df.groupby(['YEAR']).filter(lambda x: ((x['V'] == 0) | (x['V'] == 1)).any()))
print(df.groupby(['YEAR']).filter(lambda x: (x['V'] == 0).any() or (x['V'] == 1)).any())
(nicht sicher, wenn gleiche Leistung), aber hier vergleichen Skalare mitor
dfnew = df.groupby('OrderID').filter(lambda x: ((x['ResponseType']=='MODIFY_ORDER_REJECT') | x['ResponseType']=='CANCEL_ORDER_REJECT')).any() )
im Grunde meine Absicht ist es, entfernen Sie alle OrderID, enthalten enthalten MODIFY_ORDER_REJECT oder CANCEL_ORDER_REJECT überall im csv-Format. Reden können, auf chat für eine minute vielleicht. Dank