usar tutorial tablas que para manipular leer hacer funciones español documentacion datos data como python pandas dataframe group-by nan

tablas - pandas python tutorial español pdf



Groupby clase y cuenta los valores perdidos en características (3)

Tengo un problema y no puedo encontrar ninguna solución en la web o en la documentación, incluso si creo que es muy trivial.

Que quiero hacer

Tengo un marco de datos como este

CLASS FEATURE1 FEATURE2 FEATURE3 X A NaN NaN X NaN A NaN B A A A

Quiero agruparme por la etiqueta ( CLASE ) y mostrar el número de valores NaN que se cuentan en cada función para que se vea así. El propósito de esto es obtener una idea general de cómo se distribuyen los valores faltantes entre las diferentes clases.

CLASS FEATURE1 FEATURE2 FEATURE3 X 1 1 2 B 0 0 0

Sé cómo recibir la cantidad de valores no nulos -Values ​​- df.groupby[''CLASS''].count()

¿Hay algo similar para los valores de NaN ?

Intenté restar el valor de count () del tamaño () pero devolvió una salida sin formato con el valor NaN


Calcula una máscara con isna , luego agrupa y encuentra la suma:

df.drop(''CLASS'', 1).isna().groupby(df.CLASS, sort=False).sum().reset_index() CLASS FEATURE1 FEATURE2 FEATURE3 0 X 1.0 1.0 2.0 1 B 0.0 0.0 0.0

Otra opción es restar el size del count usando rsub largo del eje 0 para la resta alineada de índice:

df.groupby(''CLASS'').count().rsub(df.groupby(''CLASS'').size(), axis=0)

O,

g = df.groupby(''CLASS'') g.count().rsub(g.size(), axis=0)

FEATURE1 FEATURE2 FEATURE3 CLASS B 0 0 0 X 1 1 2

Hay bastantes buenas respuestas, así que aquí hay un timeits para su lectura:

df_ = df df = pd.concat([df_] * 10000) %timeit df.drop(''CLASS'', 1).isna().groupby(df.CLASS, sort=False).sum() %timeit df.set_index(''CLASS'').isna().sum(level=0) %%timeit g = df.groupby(''CLASS'') g.count().rsub(g.size(), axis=0) 11.8 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 9.47 ms ± 379 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 6.54 ms ± 81.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

El rendimiento real depende de sus datos y configuración, por lo que su kilometraje puede variar.


Puedes usar set_index y sum :

df.set_index(''CLASS'').isna().sum(level=0)

Salida:

FEATURE1 FEATURE2 FEATURE3 CLASS X 1.0 1.0 2.0 B 0.0 0.0 0.0


Usando la diferencia entre count y size

g=df.groupby(''CLASS'') -g.count().sub(g.size(),0) FEATURE1 FEATURE2 FEATURE3 CLASS B 0 0 0 X 1 1 2

Y podemos transformar esta pregunta en la pregunta más genérica de cómo contar la cantidad de NaN en el marco de datos con el bucle for

pd.DataFrame({x: y.isna().sum()for x , y in g }).T.drop(''CLASS'',1) Out[468]: FEATURE1 FEATURE2 FEATURE3 B 0 0 0 X 1 1 2