¿Cuál es la diferencia entre tamaño y conteo en pandas?
¿ Cuál es la diferencia entre groupby("x").count
y groupby("x").size
dentro de los pandas?
¿El tamaño simplemente excluye nada?
size
incluye NaN
valores, count
no:
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, no es del todo exacto decir " size
cuenta NaN mientras que count
no". Si bien size
cuenta los NaN, en realidad esto es una consecuencia del hecho de que size
devuelve el tamaño (o la longitud) del objeto al que se llama. Naturalmente, esto también incluye filas/valores que son NaN.
Entonces, para resumir, size
devuelve el tamaño de Series/DataFrame 1 ,
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 que no son NaN:
df.A.count()
# 3
Observe que size
es un atributo (da el mismo resultado que len(df)
o len(df.A)
). count
es una función.
1. DataFrame.size
también es un atributo 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 cuando se llama GroupBy.size()
vs.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
a todas las columnas, 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 resultado. Mientras tanto, se count
llama para cada columna, ya que los resultados dependerán de cuántos NaN tenga cada columna.
Comportamiento conpivot_table
Otro ejemplo es cómo pivot_table
trata estos datos. Supongamos que quisiéramos 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_table
, puedes 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'
se debe hacer en la serie que se pasa al values
argumento, y cuando no se 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