Questa è la differenza tra groupby("x").count
e groupby("x").size
in pandas?
La taglia esclude solo zero?
Questa è la differenza tra groupby("x").count
e groupby("x").size
in pandas?
La taglia esclude solo zero?
NaN
valori, è 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: count
funziona 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.
Risposte:
size
include NaN
valori, count
non:
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
Qual è la differenza tra size e count nei pandas?
Le altre risposte hanno evidenziato la differenza, tuttavia, non è del tutto esatto dire " size
conta NaN mentre count
no". Anche size
se conta effettivamente NaN, questa è in realtà una conseguenza del fatto che size
restituisce la dimensione (o la lunghezza) dell'oggetto su cui è chiamato. Naturalmente, questo include anche righe / valori che sono NaN.
Quindi, per riassumere, size
restituisce 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 count
conta 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).
GroupBy
- Struttura dell'outputOltre 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.count
restituisce un DataFrame quando chiami count
su tutta la colonna, mentre GroupBy.size
restituisce un Series.
Il motivo è che size
è lo stesso per tutte le colonne, quindi viene restituito un solo risultato. Nel frattempo, count
viene chiamato per ogni colonna, poiché i risultati dipenderebbero dal numero di NaN di ciascuna colonna.
pivot_table
Un altro esempio è come pivot_table
tratta 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_table
puoi 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 count
non 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 values
all'argomento, e quando non viene passato nulla, i panda decidono di non fare supposizioni.
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
size
sia l'equivalente elegante di count
in Panda.
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 groupby
allora, per ottenere i risultati corretti count()
dobbiamo associare un qualsiasi campo numerico con il groupby
per ottenere il numero esatto di gruppi per i quali size()
non c'è bisogno di questo tipo di associazione.
Oltre a tutte le risposte di cui sopra, vorrei sottolineare un'altra differenza che mi sembra significativa.
È possibile correlare le Datarame
dimensioni e il conteggio di Panda con le Vectors
dimensioni 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, DataFrame
man mano che aggiungiamo elementi, la memoria allocata aumenta.
L'attributo Size fornisce il numero di celle di memoria allocate DataFrame
mentre count fornisce il numero di elementi che sono effettivamente presenti DataFrame
. Per esempio,
Puoi vedere che ci sono 3 righe DataFrame
, la sua dimensione è 6.
Questa risposta copre le dimensioni e la differenza di conteggio rispetto a DataFrame
e non Pandas Series
. Non ho verificato cosa succede conSeries