Quelle est la différence entre groupby("x").count
et groupby("x").size
chez les pandas?
Est-ce que la taille exclut simplement zéro?
size
inclut NaN
valeurs, count
ne pas:
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
Juste pour ajouter un peu à la réponse de @ Edchum, même si les données n'ont pas de valeur NA, le résultat de count () est plus détaillé, en utilisant l'exemple précédent:
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
Lorsque nous traitons avec des cadres de données normaux, la seule différence est l'inclusion des valeurs NAN. Le nombre moyen n'inclut pas les valeurs NAN lors du comptage des lignes.
Mais si nous utilisons ces fonctions avec groupby
, pour obtenir les résultats corrects par count()
, nous devons associer tout champ numérique à groupby
pour obtenir le nombre exact de groupes où pour size()
il n’est pas nécessaire de recourir à ce type d’association.
En plus de ceux déjà mentionnés, j'ai pensé signaler quelques cas supplémentaires pour votre référence.
Comme mentionné dans les autres réponses, la principale différence est que count
exclura le nombre de NaN, alors que size
comptera tous les éléments. GroupBy
montre qu'il fait cette distinction en fonction du résultat renvoyé lorsque ces fonctions sont appelées:
np.random.seed(0)
df = pd.DataFrame(np.random.choice(3, (5, 2)), columns=list('AB'))
df
A B
0 0 1
1 0 1
2 1 2
3 0 2
4 0 0
GroupBy.count
renvoie un DataFrame lorsque vous appelez count
sur toutes les colonnes,
result = df.groupby('A').count()
result
B
A
0 4
1 1
type(result)
# pandas.core.frame.DataFrame
Alors que GroupBy.size
renvoie une série:
result = df.groupby('A').size()
result
A
0 4
1 1
dtype: int64
type(result)
# pandas.core.series.Series
La raison étant que size
est identique pour toutes les colonnes, ainsi un seul résultat est renvoyé. Pendant ce temps, la count
de chaque colonne peut différer en fonction du nombre de NaN de chaque colonne.
Un autre exemple est la façon dont pivot_table
traite ces données. Supposons que nous voulions calculer la tabulation croisée 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
Avec pivot_table
, vous pouvez émettre 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
Mais count
ne fonctionne pas; un DataFrame vide est renvoyé:
df.pivot_table(index='A', columns='B', aggfunc='count')
Empty DataFrame
Columns: []
Index: [0, 1]
Je crois que la raison en est que 'count'
doit être effectué sur la série qui est passée à l'argument values
et que, lorsque rien n'est transmis, les pandas décident de ne pas présumer.