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

86

Das ist der Unterschied zwischen groupby("x").countund groupby("x").sizebei Pandas?

Schließt die Größe nur Null aus?

Donovan Thomson
quelle
4
In der Dokumentation heißt es, dass die Größe "Anzahl der Elemente im NDFrame zurückgeben" und "Serie mit Anzahl der Nicht-NA / Null-Beobachtungen über der angeforderten Achse zurückgeben. Funktioniert auch mit Nicht-Gleitkommadaten (erkennt NaN und Keine)"
Hamsternik
Neben der akzeptierten Antwort gibt es einige andere interessante Unterschiede, die in meiner Antwort hier hervorgehoben werden .
CS95

Antworten:

98

sizeenthält NaNWerte, countnicht:

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 
EdChum
quelle
6
Ich denke, dass count auch einen DataFrame zurückgibt, während die Größe einer Serie?
Mr_and_Mrs_D
1
Die Funktion .size () ruft nur den aggregierten Wert der jeweiligen Spalte ab, während .column () für jede Spalte verwendet wird.
Nachiket
@ Mr_und_Mrs_D Größe gibt eine Ganzzahl zurück
boardtc
@boardtc df.size gibt eine Zahl zurück - die groupby-Methoden werden hier erläutert, siehe die Links in der Frage.
Mr_and_Mrs_D
Was meine Frage betrifft - Anzahl und Größe geben tatsächlich DataFrame und Series zurück, wenn sie an eine DataFrameGroupBy-Instanz "gebunden" sind - in der Frage sind sie an SeriesGroupBy gebunden, sodass beide eine Series-Instanz zurückgeben
Mr_and_Mrs_D
22

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

Die anderen Antworten haben auf den Unterschied hingewiesen, es ist jedoch nicht ganz richtig zu sagen, " sizezählt NaNs, während countdies nicht der Fall ist". Während sizeNaNs tatsächlich gezählt werden, ist dies tatsächlich eine Folge der Tatsache, dass sizedie Größe (oder die Länge) des Objekts zurückgegeben wird, auf das es aufgerufen wird. Dazu gehören natürlich auch Zeilen / Werte, die NaN sind.

Zusammenfassend sizeergibt sich also die Größe der Serie / des 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

... während countdie Nicht-NaN-Werte gezählt werden:

df.A.count()
# 3 

Beachten Sie, dass dies sizeein Attribut ist (ergibt das gleiche Ergebnis wie len(df)oder len(df.A)). countist eine Funktion.

1. DataFrame.sizeist auch ein Attribut und gibt die Anzahl der Elemente im DataFrame zurück (Zeilen x Spalten).


Verhalten mit GroupBy- Ausgabestruktur

Neben dem grundlegenden Unterschied gibt es auch den Unterschied in der Struktur der erzeugten Ausgabe beim Aufruf 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

Erwägen,

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

A
a    3
b    2
c    3
dtype: int64

Gegen,

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

   B
A   
a  2
b  0
c  2

GroupBy.countGibt einen DataFrame zurück, wenn Sie countalle Spalten aufrufen , während GroupBy.sizeeine Serie zurückgegeben wird.

Der Grund dafür sizeist , dass dies für alle Spalten gleich ist, sodass nur ein einziges Ergebnis zurückgegeben wird. In der Zwischenzeit wird das countfür jede Spalte aufgerufen, da die Ergebnisse davon abhängen würden, wie viele NaNs jede Spalte hat.


Verhalten mit pivot_table

Ein weiteres Beispiel ist die pivot_tableBehandlung dieser Daten. 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_tablekönnen Sie Folgendes ausgeben 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

Funktioniert aber countnicht; Ein leerer DataFrame wird zurückgegeben:

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

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

Ich glaube, der Grund dafür ist, 'count'dass dies für die Serie erfolgen muss, die an das valuesArgument übergeben wird, und wenn nichts übergeben wird, beschließt Pandas, keine Annahmen zu treffen.

cs95
quelle
7

Nur um ein wenig zu @ Edchums Antwort hinzuzufügen, selbst wenn die Daten keine NA-Werte haben, ist das Ergebnis von count () anhand des vorherigen Beispiels ausführlicher:

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
Bubble Bubble Bubble Gut
quelle
Es scheint sizeein elegantes Äquivalent zu countPandas zu sein.
QM.py
@ QM.py NEIN, ist es nicht. Der Grund für den Unterschied in der groupbyAusgabe wird hier erläutert .
CS95
1

Wenn es sich um normale Datenrahmen handelt, besteht der einzige Unterschied darin, dass NAN-Werte einbezogen werden. Dies bedeutet, dass bei der Zählung der Zeilen keine NAN-Werte berücksichtigt werden.

Wenn wir diese Funktionen jedoch mit dem groupbythen verwenden, count()müssen wir , um die richtigen Ergebnisse zu erhalten, ein beliebiges numerisches Feld mit dem verknüpfen groupby, um die genaue Anzahl der Gruppen zu erhalten, size()für die diese Art der Zuordnung nicht erforderlich ist.

Mukul Taneja
quelle
0

Zusätzlich zu allen oben genannten Antworten möchte ich auf einen weiteren Unterschied hinweisen, der mir bedeutsam erscheint.

Sie können die DatarameGröße und Anzahl von Panda mit der VectorsGröße und Länge von Java korrelieren . Wenn wir einen Vektor erstellen, wird ihm ein vordefinierter Speicher zugewiesen. Wenn wir uns der Anzahl der Elemente nähern, die es beim Hinzufügen von Elementen belegen kann, wird ihm mehr Speicher zugewiesen. In ähnlicher Weise DataFrameerhöht sich beim Hinzufügen von Elementen der ihm zugewiesene Speicher.

Das Größenattribut gibt die Anzahl der Speicherzellen an, die zugeordnet sind, DataFramewährend count die Anzahl der Elemente angibt, die tatsächlich vorhanden sind DataFrame. Beispielsweise, Geben Sie hier die Bildbeschreibung ein

Sie können sehen, obwohl es 3 Zeilen gibt DataFrame, seine Größe ist 6.

Diese Antwort deckt Größen- und Zählunterschiede in Bezug auf DataFrameund nicht ab Pandas Series. Ich habe nicht überprüft, was passiert mitSeries

drp
quelle