Saltar al contenido

¿Cuál es la diferencia entre tamaño y conteo en pandas?

Esta crónica fue probado por nuestros expertos para asegurar la veracidad de este post.

Solución:

size incluye NaN valores, count no es:

In [46]:
df = pd.DataFrame('a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6))
df

Out[46]:
   a   b         c
0  0   1  1.067627
1  0   2  0.554691
2  1   3  0.458084
3  2   4  0.426635
4  2 NaN -2.238091
5  2   4  1.256943

In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())

a
0    2
1    1
2    2
Name: b, dtype: int64

a
0    2
1    1
2    3
dtype: int64 

¿Cuál es la diferencia entre tamaño y conteo en pandas?

Las otras respuestas han señalado la diferencia, sin embargo, es no completamente exacto decir “size cuenta NaNs mientras count no lo hace”. Mientras size de hecho cuenta NaNs, esto es en realidad una consecuencia del hecho de que size devuelve el Talla (o la longitud) del objeto se llama. Naturalmente, esto también incluye filas/valores que son NaN.

Entonces, para resumir, size devuelve el tamaño de la serie/marco de datos1,

df = pd.DataFrame('A': ['x', 'y', np.nan, 'z'])
df

     A
0    x
1    y
2  NaN
3    z

df.A.size
# 4

…mientras count cuenta los valores no NaN:

df.A.count()
# 3 

Darse cuenta de size es un attribute (da el mismo resultado que len(df) o len(df.A)). count es una función

1. DataFrame.size es también un attribute y devuelve el número de elementos en el DataFrame (filas x columnas).


Comportamiento con GroupBy – Estructura de salida

Además de la diferencia básica, también existe la diferencia en la estructura de la salida generada al llamar GroupBy.size() contra GroupBy.count().

df = pd.DataFrame('A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x'])
df
   A    B
0  a    x
1  a    x
2  a  NaN
3  b  NaN
4  b  NaN
5  c  NaN
6  c    x
7  c    x

Considerar,

df.groupby('A').size()

A
a    3
b    2
c    3
dtype: int64

Versus,

df.groupby('A').count()

   B
A   
a  2
b  0
c  2

GroupBy.count devuelve un DataFrame cuando llamas count en toda la columna, mientras que GroupBy.size devuelve una Serie.

La razón es que size es el mismo para todas las columnas, por lo que solo se devuelve un único resultado. Mientras tanto, el count se llama para cada columna, ya que los resultados dependerían de cuántos NaN tiene cada columna.


Comportamiento con pivot_table

Otro ejemplo es cómo pivot_table trata estos datos. Supongamos que nos gustaría calcular la tabulación cruzada de

df

   A  B
0  0  1
1  0  1
2  1  2
3  0  2
4  0  0

pd.crosstab(df.A, df.B)  # Result we expect, but with `pivot_table`.

B  0  1  2
A         
0  1  2  1
1  0  0  1

Con pivot_tablepuede emitir size:

df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)

B  0  1  2
A         
0  1  2  1
1  0  0  1

Pero count No funciona; se devuelve un DataFrame vacío:

df.pivot_table(index='A', columns='B', aggfunc='count')

Empty DataFrame
Columns: []
Index: [0, 1]

Creo que la razón de esto es que 'count' debe hacerse sobre la serie que se pasa al values argumento, y cuando no pasa nada, pandas decide no hacer suposiciones.

Solo para agregar un poco a la respuesta de @Edchum, incluso si los datos no tienen valores NA, el resultado de count() es más detallado, usando el ejemplo anterior:

grouped = df.groupby('a')
grouped.count()
Out[197]: 
   b  c
a      
0  2  2
1  1  1
2  2  3
grouped.size()
Out[198]: 
a
0    2
1    1
2    3
dtype: int64

Si crees que ha resultado de utilidad nuestro post, te agradeceríamos que lo compartas con otros programadores de esta forma contrubuyes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *