wake-up-neo.net

Was ist der Unterschied zwischen Größe und Anzahl bei Pandas?

Das ist der Unterschied zwischen groupby("x").count und groupby("x").size bei Pandas?

Schließt Größe nur Null aus?

44
Donovan Thomson

size enthält NaN Werte, count nicht:

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

Um der Antwort von @ Edchum ein wenig hinzuzufügen, auch wenn die Daten keine NA-Werte haben, ist das Ergebnis von count () ausführlicher, wie im vorherigen Beispiel:

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

Wenn wir uns mit normalen Datenframes beschäftigen, besteht der einzige Unterschied darin, dass NAN-Werte eingeschlossen werden. Die Anzahl enthält keine NAN-Werte, während die Zeilen gezählt werden.

Wenn wir diese Funktionen jedoch mit groupby verwenden, müssen wir, um die korrekten Ergebnisse durch count() zu erhalten, jedes numerische Feld mit dem groupby verknüpfen, um die genaue Anzahl von Gruppen zu ermitteln, für die size() keine Zuordnung erforderlich ist.

1
Mukul Taneja

Abgesehen von den bereits erwähnten, hätte ich gedacht, dass ich ein paar zusätzliche Fälle für Ihre Referenz nennen würde. 


Wie in den anderen Antworten erwähnt, besteht der Hauptunterschied darin, dass count die Anzahl der NaNs ausschließt, während size alle Elemente zählt. GroupBy zeigt, dass diese Unterscheidung anhand der Ausgabe erfolgt, die beim Aufruf dieser Funktionen zurückgegeben wird:

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 gibt einen DataFrame zurück, wenn Sie count für alle Spalten aufrufen.

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

   B
A   
0  4
1  1

type(result)
# pandas.core.frame.DataFrame

Während GroupBy.size eine Serie zurückgibt:

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

A
0    4
1    1
dtype: int64


type(result)
# pandas.core.series.Series

Der Grund dafür ist, dass size für alle Spalten gleich ist, sodass nur ein einziges Ergebnis zurückgegeben wird. Inzwischen kann sich die count für jede Spalte davon unterscheiden, wie viele NaNs jede Spalte hat.


Ein anderes Beispiel ist, wie pivot_table diese Daten behandelt. Angenommen, wir möchten die Kreuztabelle von berechnen 

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

Mit pivot_table können Sie size ausgeben:

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

Aber count funktioniert nicht; Es wird ein leerer DataFrame zurückgegeben:

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

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

Ich glaube, der Grund dafür ist, dass 'count' für die Serie gemacht werden muss, die an das values-Argument übergeben wird. Wenn nichts übergeben wird, entscheidet Pandas, keine Annahmen zu treffen.

0
coldspeed