Das ist der Unterschied zwischen groupby("x").count
und groupby("x").size
bei Pandas?
Schließt Größe nur Null aus?
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
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.
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.