Jaka jest różnica między pandami groupby("x").count
i groupby("x").size
w nich?
Czy rozmiar po prostu wyklucza zero?
Jaka jest różnica między pandami groupby("x").count
i groupby("x").size
w nich?
Czy rozmiar po prostu wyklucza zero?
NaN
wartoś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: count
działa jak każda inna funkcja agregująca ( mean
, max
...), ale size
jest 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:
size
zawiera NaN
wartości, count
nie:
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.size
count
size
size
Podsumowując, size
zwraca 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 count
liczy wartości inne niż NaN:
df.A.count()
# 3
Zauważ, że size
jest to atrybut (daje taki sam wynik jak len(df)
lub len(df.A)
). count
jest funkcją.
1. DataFrame.size
jest 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.count
zwraca DataFrame, gdy wywołujesz count
wszystkie kolumny, whileGroupBy.size
zwraca Series.
Powodem jest size
to, że jest taki sam dla wszystkich kolumn, więc zwracany jest tylko jeden wynik. W międzyczasie count
wywoływana jest dla każdej kolumny, ponieważ wyniki będą zależeć od tego, ile NaN ma każda kolumna.
pivot_table
Innym przykładem jest sposób pivot_table
traktowania 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_table
moż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 count
nie 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 values
argumentu, 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
size
jest to elegancki odpowiednik count
w 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 groupby
then, aby uzyskać prawidłowe wyniki, count()
musimy powiązać dowolne pole liczbowe z, groupby
aby 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ć Datarame
rozmiar Pandy i liczyć z Vectors
rozmiarem 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, DataFrame
gdy dodajemy elementy, ilość przydzielonej mu pamięci wzrasta.
Atrybut size podaje liczbę przydzielonych komórek pamięci, DataFrame
a 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 DataFrame
i nie Pandas Series
. Nie sprawdziłem, co się dzieje zSeries