2016-01-09 5 views
7

Ich habe Gruppierungen von Werten in den Daten und innerhalb jeder Gruppe möchte ich überprüfen, ob ein Wert innerhalb der Gruppe unter 8 ist. Wenn diese Bedingung erfüllt ist, wird die gesamte Gruppe aus dem Datensatz entfernt.Pandas: Gruppe aus den Daten entfernen, wenn ein Wert in der Gruppe eine erforderliche Bedingung erfüllt

Bitte beachten Sie, dass der Wert, auf den ich mich beziehe, in einer anderen Spalte der Gruppierungsspalte liegt.

Beispiel Eingabe:

Groups Count 
    1  7 
    1  11 
    1  9 
    2  12 
    2  15 
    2  21 

Output:

Groups Count 
    2  12 
    2  15 
    2  21 

Antwort

11

Nach dem, was Sie in der Frage beschrieben, solange es mindestens einen Wert unter 8 innerhalb der Gruppe ist, dann sollte diese Gruppe fallen gelassen werden. Die äquivalente Aussage besagt also, dass, solange der Mindestwert innerhalb dieser Gruppe unter 8 liegt, diese Gruppe gelöscht werden sollte.

Durch die Filterfunktion verwenden, der eigentliche Code kann eine Zeile nur reduziert werden, finden Sie in Filtration, können Sie den folgenden Code verwenden:

dfnew = df.groupby('Groups').filter(lambda x: x['Count'].min()>8) 
dfnew.reset_index(drop=True, inplace=True) # reset index 
dfnew = dfnew[['Groups','Count']] # rearrange the column sequence 
print(dfnew) 

Output: 
    Groups Count 
0  2  12 
1  2  15 
2  2  21 
+0

sollte dies als die richtige Antwort in Bezug auf die Frage markiert der OP – Daniel

+0

Ah .. vermasselt meinen Kommentar nach oben. Dies sollte als die richtige Antwort in Bezug auf die Frage des OP markiert werden, da dies die eleganteste Art ist, Pandas inbuild 'groupby' Funktion zu benutzen. Es ist sehr effizient und lesbar und ein One-Liner. 1up – Daniel

3

Sie können mit isin, loc und unique mit Subset durch invertierte Maske ausgewählt wird. Zuletzt können Sie reset_index:

print df 

    Groups Count 
0  1  7 
1  1  11 
2  1  9 
3  2  12 
4  2  15 
5  2  21 

print df.loc[df['Count'] < 8, 'Groups'].unique() 
[1] 

print ~df['Groups'].isin(df.loc[df['Count'] < 8, 'Groups'].unique()) 

0 False 
1 False 
2 False 
3  True 
4  True 
5  True 
Name: Groups, dtype: bool 

df1 = df[~df['Groups'].isin(df.loc[df['Count'] < 8, 'Groups'].unique())] 
print df1.reset_index(drop=True) 

    Groups Count 
0  2  12 
1  2  15 
2  2  21 
Verwandte Themen