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

Esa es la diferencia entre groupby("x").count groupby("x").size y groupby("x").size en pandas?

¿El tamaño simplemente excluye nulo?

size incluye los valores de NaN , el 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]: abc 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 

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

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

Las otras respuestas han señalado la diferencia, sin embargo, no es del todo exacto decir que “el size cuenta las NaN mientras que la count no”. Si bien el size sí cuenta los NaN, esto es en realidad una consecuencia del hecho de que el 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, el 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 

Observe que size es un atributo (da el mismo resultado que len(df) o len(df.A) ). Pero count es una función, y cuenta los valores que no son NaN:

 df.A.count() # 3 

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.

 df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']}) df AB 0 ax 1 ax 2 a NaN 3 b NaN 4 b NaN 5 c NaN 6 cx 7 cx df.groupby('A').size() A a 3 b 2 c 3 dtype: int64 

Mientras count cuenta los valores que no son NaN.

 df.groupby('A').count() B A a 2 b 0 c 2 

Además, verá que GroupBy.count devuelve un DataFrame cuando llama al count en todas las columnas, mientras que GroupBy.size devuelve una Serie.

La razón es que el size es el mismo para todas las columnas, por lo que solo se devuelve un único resultado. Mientras tanto, el count para cada columna puede diferir según la cantidad de NaN que tenga 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 AB 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 , puede 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 la 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 el 'count' debe hacer en la serie que se pasa al argumento de los values , y cuando no se pasa nada, los pandas deciden no hacer suposiciones.

Cuando tratamos con marcos de datos normales, entonces solo la diferencia será una inclusión de los valores NAN, el conteo de medios no incluye los valores NAN mientras se cuentan las filas.

Pero si estamos usando estas funciones con el groupby , para obtener los resultados correctos por count() debemos asociar cualquier campo numérico con el groupby para obtener el número exacto de grupos donde para size() no hay necesidad de este tipo de asociación.