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

Resuelto Donovan Thomson asked hace 9 años • 5 respuestas

¿ Cuál es la diferencia entre groupby("x").county groupby("x").sizedentro de los pandas?

¿El tamaño simplemente excluye nada?

Donovan Thomson avatar Oct 26 '15 20:10 Donovan Thomson
Aceptado

sizeincluye NaNvalores, countno:

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 
EdChum avatar Oct 26 '2015 13:10 EdChum

¿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 " sizecuenta NaN mientras que countno". Si bien sizecuenta los NaN, en realidad esto es una consecuencia del hecho de que sizedevuelve 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, sizedevuelve 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 countcuenta los valores que no son NaN:

df.A.count()
# 3 

Observe que sizees un atributo (da el mismo resultado que len(df)o len(df.A)). countes una función.

1. DataFrame.sizetambié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.countDevuelve un DataFrame cuando llamas counta todas las columnas, mientras que GroupBy.sizedevuelve una Serie.

La razón es que sizees el mismo para todas las columnas, por lo que solo se devuelve un resultado. Mientras tanto, se countllama 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_tabletrata 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 countno 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 valuesargumento, y cuando no se pasa nada, pandas decide no hacer suposiciones.

cs95 avatar Jan 25 '2019 11:01 cs95

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
Bubble Bubble Bubble Gut avatar Dec 29 '2016 20:12 Bubble Bubble Bubble Gut