Dokumentacja mówi, że rozmiar „zwraca liczbę elementów w ramce NDFrame” i count „zwraca serię z liczbą obserwacji innych niż NA / zerowych na żądanej osi. Działa również z danymi nie zmiennoprzecinkowymi (wykrywa NaN i Brak)”
hamsternik
1
Przyjęta odpowiedź stwierdza, że różnica polega na uwzględnieniu lub wykluczeniu 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.
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
0011.0676271020.5546912130.4580843240.42663542 NaN -2.2380915241.256943
In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())
a
021122
Name: b, dtype: int64
a
021123
dtype: int64
Myślę, że liczba zwraca również DataFrame, podczas gdy rozmiar serii?
Mr_and_Mrs_D
1
Funkcja .size () pobiera zagregowaną wartość konkretnej kolumny tylko podczas gdy .column () jest używana dla każdej kolumny.
Nachiket
@Mr_and_Mrs_D size zwraca liczbę całkowitą
boardtc
@boardtc df.size zwraca liczbę - metody grupowania są omówione tutaj, zobacz linki w pytaniu.
Mr_and_Mrs_D
Jeśli chodzi o moje pytanie - liczba i rozmiar rzeczywiście zwracają odpowiednio DataFrame i Series po „powiązaniu” z instancją DataFrameGroupBy - w pytaniu są powiązane z SeriesGroupBy, więc oba zwracają instancję Series
Mr_and_Mrs_D
29
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).
Zachowanie z GroupBy - Struktura wyników
Opró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.
Zachowanie z pivot_table
Innym przykładem jest sposób pivot_tabletraktowania tych danych. Załóżmy, że chcielibyśmy obliczyć zestawienie krzyżowe
df
A B
001101212302400
pd.crosstab(df.A, df.B) # Result we expect, but with `pivot_table`.
B 012
A
01211001
Za pomocą pivot_tablemożesz wydać size:
df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)
B 012
A
01211001
Ale countnie działa; zwracana jest pusta ramka DataFrame:
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
022111223
grouped.size()
Out[198]:
a
021123
dtype: int64
Wydaje się, że sizejest to elegancki odpowiednik countw pandach.
QM.py
@ QM.py NIE, nie jest. Powodem różnicy w groupbywydajności jest wyjaśnione tutaj .
cs95
1
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
NaN
wartości, należy zauważyć, że jest to kwestia drugorzędna. Porównanie wynikówdf.groupby('key').size()
i ofdf.groupby('key').count()
dla DataFrame z wieloma seriami. Różnica jest oczywista:count
działa jak każda inna funkcja agregująca (mean
,max
...), alesize
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
zawieraNaN
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
źródło
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 jaklen(df)
lublen(df.A)
).count
jest funkcją.1.
DataFrame.size
jest również atrybutem i zwraca liczbę elementów w DataFrame (wiersze x kolumny).Zachowanie z
GroupBy
- Struktura wynikówOprócz podstawowej różnicy, istnieje również różnica w strukturze wytwarzanej mocy podczas wywoływania
GroupBy.size()
vsGroupBy.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łujeszcount
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ędzyczasiecount
wywoływana jest dla każdej kolumny, ponieważ wyniki będą zależeć od tego, ile NaN ma każda kolumna.Zachowanie z
pivot_table
Innym przykładem jest sposób
pivot_table
traktowania tych danych. Załóżmy, że chcielibyśmy obliczyć zestawienie krzyżowedf 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 dovalues
argumentu, a kiedy nic nie jest przekazywane, pandy decydują się nie czynić żadnych założeń.źródło
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
źródło
size
jest to elegancki odpowiednikcount
w pandach.groupby
wydajności jest wyjaśnione tutaj .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órychsize()
nie ma potrzeby tego typu skojarzenia.źródło
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ć zVectors
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 obecneDataFrame
. 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 niePandas Series
. Nie sprawdziłem, co się dzieje zSeries
źródło