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
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