Qual è la differenza tra size e count nei pandas?


96

Questa è la differenza tra groupby("x").counte groupby("x").sizein pandas?

La taglia esclude solo zero?


4
La documentazione diceva che la dimensione "restituisce il numero di elementi nell'NDFrame" e il conteggio "restituisce la serie con il numero di osservazioni non NA / nulle sull'asse richiesto. Funziona anche con dati in virgola mobile (rileva NaN e Nessuno)"
hamsternik

1
La risposta accettata afferma che la differenza include o esclude NaNvalori, è necessario notare che questo è un punto secondario. Confronta gli output di df.groupby('key').size()e di df.groupby('key').count()per un DataFrame con più serie. La differenza è ovvia: countfunziona come qualsiasi altra funzione aggregata ( mean, max...) ma sizeè specifica per ottenere il numero di voci di indice nel gruppo, e quindi non guarda i valori nelle colonne che non hanno significato per questa funzione. Vedere la risposta @ cs95 per una spiegazione accurata.
min

Risposte:


108

sizeinclude NaNvalori, countnon:

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 

6
Penso che il conteggio restituisca anche un DataFrame mentre taglia una serie?
Mr_and_Mrs_D

1
La funzione .size () ottiene il valore aggregato della particolare colonna solo mentre .column () viene utilizzato per ogni colonna.
Nachiket

La dimensione di @Mr_and_Mrs_D restituisce un numero intero
boardtc

@boardtc df.size restituisce un numero: i metodi groupby sono discussi qui, vedere i collegamenti nella domanda.
Mr_and_Mrs_D

Per quanto riguarda la mia domanda - il conteggio e le dimensioni restituiscono effettivamente DataFrame e Series rispettivamente quando "associati" a un'istanza DataFrameGroupBy - nella domanda sono associati a SeriesGroupBy quindi entrambi restituiscono un'istanza Series
Mr_and_Mrs_D

29

Qual è la differenza tra size e count nei pandas?

Le altre risposte hanno evidenziato la differenza, tuttavia, non è del tutto esatto dire " sizeconta NaN mentre countno". Anche sizese conta effettivamente NaN, questa è in realtà una conseguenza del fatto che sizerestituisce la dimensione (o la lunghezza) dell'oggetto su cui è chiamato. Naturalmente, questo include anche righe / valori che sono NaN.

Quindi, per riassumere, sizerestituisce la dimensione di 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

... mentre countconta i valori non NaN:

df.A.count()
# 3 

Si noti che sizeè un attributo (dà lo stesso risultato di len(df)o len(df.A)). countè una funzione.

1. DataFrame.sizeè anche un attributo e restituisce il numero di elementi nel DataFrame (righe x colonne).


Comportamento con GroupBy- Struttura dell'output

Oltre alla differenza di base, c'è anche la differenza nella struttura della produzione generato quando si chiama 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

Ritenere,

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

A
a    3
b    2
c    3
dtype: int64

Contro,

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

   B
A   
a  2
b  0
c  2

GroupBy.countrestituisce un DataFrame quando chiami countsu tutta la colonna, mentre GroupBy.sizerestituisce un Series.

Il motivo è che sizeè lo stesso per tutte le colonne, quindi viene restituito un solo risultato. Nel frattempo, countviene chiamato per ogni colonna, poiché i risultati dipenderebbero dal numero di NaN di ciascuna colonna.


Comportamento con pivot_table

Un altro esempio è come pivot_tabletratta questi dati. Supponiamo di voler calcolare la tabulazione incrociata di

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_tablepuoi emettere 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

Ma countnon funziona; viene restituito un DataFrame vuoto:

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

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

Credo che il motivo sia che 'count'deve essere fatto sulla serie passata valuesall'argomento, e quando non viene passato nulla, i panda decidono di non fare supposizioni.


7

Solo per aggiungere un po 'alla risposta di @ Edchum, anche se i dati non hanno valori NA, il risultato di count () è più dettagliato, usando l'esempio prima:

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

Sembra sizesia l'equivalente elegante di countin Panda.
QM.py

@ QM.py NO, non lo è. Il motivo della differenza groupbynell'output è spiegato qui .
cs95

1

Quando abbiamo a che fare con frame di dati normali, l'unica differenza sarà un'inclusione di valori NAN, significa che il conteggio non include i valori NAN durante il conteggio delle righe.

Ma se stiamo usando queste funzioni con il groupbyallora, per ottenere i risultati corretti count()dobbiamo associare un qualsiasi campo numerico con il groupbyper ottenere il numero esatto di gruppi per i quali size()non c'è bisogno di questo tipo di associazione.


0

Oltre a tutte le risposte di cui sopra, vorrei sottolineare un'altra differenza che mi sembra significativa.

È possibile correlare le Dataramedimensioni e il conteggio di Panda con le Vectorsdimensioni e la lunghezza di Java . Quando creiamo un vettore, ad esso viene allocata una memoria predefinita. quando ci avviciniamo al numero di elementi che può occupare durante l'aggiunta di elementi, viene allocata più memoria. Allo stesso modo, DataFrameman mano che aggiungiamo elementi, la memoria allocata aumenta.

L'attributo Size fornisce il numero di celle di memoria allocate DataFramementre count fornisce il numero di elementi che sono effettivamente presenti DataFrame. Per esempio, inserisci qui la descrizione dell'immagine

Puoi vedere che ci sono 3 righe DataFrame, la sua dimensione è 6.

Questa risposta copre le dimensioni e la differenza di conteggio rispetto a DataFramee non Pandas Series. Non ho verificato cosa succede conSeries

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.