Pandas de Python: excluye filas por debajo de un cierto conteo de frecuencia

Así que tengo un DataFrame de pandas que se ve así:

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

Me gustaría filtrar todas las filas por posición que no aparezcan al menos 20 veces. He visto algo como esto

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

pero esto no parece funcionar y no entiendo cómo recuperar el dataframe original. Gracias de antemano por la ayuda.

En su conjunto de datos limitado los siguientes trabajos:

 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 

Puede asignar el resultado de este filtro y usarlo con isin para filtrar su origen 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 

Solo necesitas cambiar de 3 a 20 en tu caso

Otro enfoque sería usar value_counts para crear una serie agregada, luego podemos usar esto para filtrar su 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 

EDITAR

Si desea filtrar el objeto groupby en el dataframe en lugar de una serie, puede llamar a filter en el objeto groupby directamente:

 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 

¿Qué hay de seleccionar todas las filas de position con valores> = 20

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