Jaka jest różnica między pandami groupby("x").counti groupby("x").sizew nich?
Czy rozmiar po prostu wyklucza zero?
Jaka jest różnica między pandami groupby("x").counti groupby("x").sizew nich?
Czy rozmiar po prostu wyklucza zero?
NaNwartości, należy zauważyć, że jest to kwestia drugorzędna. Porównanie wyników df.groupby('key').size()i of df.groupby('key').count()dla DataFrame z wieloma seriami. Różnica jest oczywista: countdziała jak każda inna funkcja agregująca ( mean, max...), ale sizejest specyficzna dla uzyskania liczby wpisów indeksu w grupie, dlatego nie sprawdza wartości w kolumnach, które są bez znaczenia dla tej funkcji. Zobacz odpowiedź @ cs95, aby uzyskać dokładne wyjaśnienie.
Odpowiedzi:
sizezawiera NaNwartości, countnie:
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
Jaka jest różnica między rozmiarem a liczbą pand?
Inne odpowiedzi zwróciły uwagę na różnicę, jednak stwierdzenie „ liczy NaN, a nie liczy ” nie jest całkowicie dokładne . Chociaż faktycznie liczy NaN, jest to w rzeczywistości konsekwencja faktu, że zwraca rozmiar (lub długość) obiektu, do którego jest wywoływany. Oczywiście obejmuje to również wiersze / wartości, które są NaN.sizecountsizesize
Podsumowując, sizezwraca rozmiar Series / 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
... while countliczy wartości inne niż NaN:
df.A.count()
# 3
Zauważ, że sizejest to atrybut (daje taki sam wynik jak len(df)lub len(df.A)). countjest funkcją.
1. DataFrame.sizejest również atrybutem i zwraca liczbę elementów w DataFrame (wiersze x kolumny).
GroupBy - Struktura wynikówOprócz podstawowej różnicy, istnieje również różnica w strukturze wytwarzanej mocy podczas wywoływania 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
Rozważać,
df.groupby('A').size()
A
a 3
b 2
c 3
dtype: int64
Przeciw,
df.groupby('A').count()
B
A
a 2
b 0
c 2
GroupBy.countzwraca DataFrame, gdy wywołujesz countwszystkie kolumny, whileGroupBy.size zwraca Series.
Powodem jest sizeto, że jest taki sam dla wszystkich kolumn, więc zwracany jest tylko jeden wynik. W międzyczasie countwywoływana jest dla każdej kolumny, ponieważ wyniki będą zależeć od tego, ile NaN ma każda kolumna.
pivot_tableInnym przykładem jest sposób pivot_tabletraktowania tych danych. Załóżmy, że chcielibyśmy obliczyć zestawienie krzyżowe
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
Za pomocą pivot_tablemożesz wydać 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
Ale countnie działa; zwracana jest pusta ramka DataFrame:
df.pivot_table(index='A', columns='B', aggfunc='count')
Empty DataFrame
Columns: []
Index: [0, 1]
Uważam, że powodem tego jest to, że 'count'należy to zrobić na serii, która jest przekazywana do valuesargumentu, a kiedy nic nie jest przekazywane, pandy decydują się nie czynić żadnych założeń.
Aby dodać trochę do odpowiedzi @ Edchum, nawet jeśli dane nie mają wartości NA, wynik funkcji count () jest bardziej szczegółowy, korzystając z wcześniejszego przykładu:
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
sizejest to elegancki odpowiednik countw pandach.
Kiedy mamy do czynienia z normalnymi ramkami danych, jedyną różnicą będzie uwzględnienie wartości NAN, co oznacza, że liczba nie obejmuje wartości NAN podczas liczenia wierszy.
Ale jeśli używamy tych funkcji z groupbythen, aby uzyskać prawidłowe wyniki, count()musimy powiązać dowolne pole liczbowe z, groupbyaby uzyskać dokładną liczbę grup, dla których size()nie ma potrzeby tego typu skojarzenia.
Oprócz wszystkich powyższych odpowiedzi chciałbym zwrócić uwagę na jeszcze jedną różnicę, która wydaje mi się istotna.
Możesz skorelować Dataramerozmiar Pandy i liczyć z Vectorsrozmiarem i długością Javy . Kiedy tworzymy wektor, przydzielana jest mu pewna predefiniowana pamięć. gdy zbliżamy się do liczby elementów, które może zająć podczas dodawania elementów, alokuje się do niego więcej pamięci. Podobnie, DataFramegdy dodajemy elementy, ilość przydzielonej mu pamięci wzrasta.
Atrybut size podaje liczbę przydzielonych komórek pamięci, DataFramea count podaje liczbę elementów, które są w rzeczywistości obecne DataFrame. Na przykład,

Jak widać, chociaż są 3 rzędy DataFrame, jego rozmiar to 6.
Ta odpowiedź obejmuje różnice w wielkości i liczebności w odniesieniu do DataFramei nie Pandas Series. Nie sprawdziłem, co się dzieje zSeries