2016-01-09 14 views
7

Ho raggruppamenti di valori nei dati e all'interno di ciascun gruppo, vorrei verificare se un valore all'interno del gruppo è inferiore a 8. Se questa condizione viene soddisfatta, l'intero gruppo viene rimosso dal set di dati.Panda: rimuovere il gruppo dai dati quando un valore nel gruppo soddisfa una condizione richiesta

Si noti che il valore a cui mi riferisco si trova in un'altra colonna della colonna dei raggruppamenti.

Esempio Ingresso:

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

uscita:

Groups Count 
    2  12 
    2  15 
    2  21 

risposta

11

In base a quello che hai descritto nella questione, a patto che ci sia almeno un valore è inferiore a 8 all'interno del gruppo, allora quel gruppo dovrebbe essere eliminato. Quindi la dichiarazione equivalente è che finché il valore minimo all'interno di quel gruppo è inferiore a 8, quel gruppo dovrebbe essere eliminato.

Utilizzando la funzione di filtro, il codice vero e proprio può essere ridotta ad una sola linea, si prega di fare riferimento al Filtration, è possibile utilizzare il seguente codice:

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

questo dovrebbe essere contrassegnato come la risposta corretta per quanto riguarda la domanda dell'OP – Daniel

+0

Ah .. incasinato il mio commento. Questo dovrebbe essere contrassegnato come la risposta corretta per quanto riguarda la domanda dell'OP in quanto questo è il modo più elegante di usare la funzione panda inbuild 'groupby'. È altamente efficace e leggibile e monofoderato. 1up – Daniel

3

È possibile utilizzare isin, loc e unique con la selezione sottoinsieme dalla maschera invertita. Ultimo è possibile 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