2015-05-27 8 views
7

Così ho un dataframe panda che assomiglia a questo:Python panda: escludere le righe al di sotto di un certo numero di frequenze

r vals positions 
1.2  1 
1.8  2 
2.3  1 
1.8  1 
2.1  3 
2.0  3 
1.9  1 
...  ... 

Vorrei il filtro tutte le righe di posizione che non appaiono almeno 20 volte. Ho visto qualcosa di simile

g=df.groupby('positions') 
g.filter(lambda x: len(x) > 20) 

ma questo non sembra funzionare e non capisco come ottenere il dataframe originale indietro da questo. Grazie in anticipo per l'aiuto.

+0

Scusa, stai chiedendo di filtrare 'r vals' che non compaiono almeno 20 volte o che vuoi filtrare le posizioni che non hanno 20 rval unici? – EdChum

risposta

17

Sul set di dati limitata le seguenti opere:

In [125]: 
df.groupby('positions')['r vals'].filter(lambda x: len(x) >= 3) 

Out[125]: 
0 1.2 
2 2.3 
3 1.8 
6 1.9 
Name: r vals, dtype: float64 

È possibile assegnare il risultato di questo filtro e utilizzare questo con isin per filtrare il tuo orig df:

In [129]: 
filtered = df.groupby('positions')['r vals'].filter(lambda x: len(x) >= 3) 
df[df['r vals'].isin(filtered)] 

Out[129]: 
    r vals positions 
0  1.2   1 
1  1.8   2 
2  2.3   1 
3  1.8   1 
6  1.9   1 

Hai solo bisogno di cambiare 3-20 nel tuo caso

Un altro approccio sarebbe quello di utilizzare value_counts per creare una serie di aggregazione, possiamo usare questo per filtrare la df:

In [136]: 
counts = df['positions'].value_counts() 
counts 

Out[136]: 
1 4 
3 2 
2 1 
dtype: int64 

In [137]: 
counts[counts > 3] 

Out[137]: 
1 4 
dtype: int64 

In [135]: 
df[df['positions'].isin(counts[counts > 3].index)] 

Out[135]: 
    r vals positions 
0  1.2   1 
2  2.3   1 
3  1.8   1 
6  1.9   1 

EDIT

Se si desidera per filtrare l'oggetto groupby sul dataframe piuttosto che una serie, è possibile chiamare direttamente filter sull'oggetto groupby:

In [139]: 
filtered = df.groupby('positions').filter(lambda x: len(x) >= 3) 
filtered 

Out[139]: 
    r vals positions 
0  1.2   1 
2  2.3   1 
3  1.8   1 
6  1.9   1 
+0

Grazie, funziona perfettamente. Voglio il dataframe completo, ma così ho rimosso ['r vals'] dalla tua linea. Saluti! –

0

Come sulla selezione di tutti i position righe con valori> = 20

mask = df['position'] >= 20 
sel = df.ix[mask, :] 
+0

L'OP chiede un filtro di posizioni per numero anziché valore – EdChum

+0

Penso che abbiate frainteso la domanda. Voglio contare le righe con posizione, ad esempio, essere uguale a 1 e quindi rimuovere tutte quelle righe se il conteggio è <20. Non importa quale sia il valore della posizione, solo il conteggio delle righe che contengono lo stesso valore. Dispiace per la confusione. –

+0

Mi dispiace, e la risposta non utile. –

Problemi correlati