2016-01-09 20 views
7

Mam grupy wartości w danych iw ramach każdej grupy, chciałbym sprawdzić, czy wartość w grupie jest poniżej 8. Jeśli ten warunek zostanie spełniony, cała grupa zostanie usunięta ze zbioru danych.Pandy: usuń grupę z danych, gdy wartość w grupie spełnia wymagany warunek.

Należy pamiętać, że wartość, o której mówię, znajduje się w innej kolumnie kolumny Kolumny.

Przykład Wejście:

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

wyjściowa:

Groups Count 
    2  12 
    2  15 
    2  21 

Odpowiedz

11

W oparciu o to, co opisano w odpowiedzi na pytanie, jak długo istnieje co najmniej jedna wartość jest poniżej 8 w grupie, a następnie, że grupa powinna zostać pominięte. Tak więc równoważne stwierdzenie jest takie, że dopóki minimalna wartość w tej grupie jest mniejsza niż 8, ta grupa powinna zostać usunięta.

przy użyciu funkcji filtrowania, rzeczywisty kod może być zmniejszona do tylko jednej linii, należy zapoznać się Filtration, można użyć następującego kodu:

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

ten powinien być oznaczony jako prawidłową odpowiedź dotyczącą kwestii z OP – Daniel

+0

Ah .. zawiedli mój komentarz w górę. Powinno to zostać oznaczone jako poprawna odpowiedź na pytanie o PO, ponieważ jest to najbardziej elegancki sposób wykorzystania funkcji "groupby" w pandach. Jest bardzo wydajny i czytelny, a jednolinijkowy. 1up – Daniel

3

Można użyć isin, loc i unique z wyboru podzbioru o odwróconym maski. Ostatnio można 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 
Powiązane problemy