web-dev-qa-db-fra.com

Quelle est la différence entre taille et nombre chez les pandas?

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?

44
Donovan Thomson

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 
58
EdChum

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
6

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.

1
Mukul Taneja

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.

0
coldspeed