Jaka jest różnica między rozmiarem a liczbą pand?

96

Jaka jest różnica między pandami groupby("x").counti groupby("x").sizew nich?

Czy rozmiar po prostu wyklucza zero?

Donovan Thomson
źródło
4
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.
min

Odpowiedzi:

108

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 
EdChum
źródło
6
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
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ń.

cs95
źródło
7

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
Bubble Bubble Bubble Gut
źródło
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.

Mukul Taneja
źródło
0

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, wprowadź opis obrazu tutaj

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

drp
źródło