Apa perbedaan antara ukuran dan jumlah pada panda?

96

Apa perbedaan antara groupby("x").countdan groupby("x").sizepada panda?

Apakah ukuran tidak termasuk nol?

Donovan Thomson
sumber
4
Dokumentasi mengatakan, ukuran itu "mengembalikan jumlah elemen dalam NDFrame", dan menghitung "Seri mengembalikan dengan jumlah observasi non-NA / null di atas sumbu yang diminta. Bekerja dengan data non-floating point juga (mendeteksi NaN dan None)"
hamsternik
1
Jawaban yang diterima menyatakan perbedaannya termasuk atau tidak termasuk NaNnilai, harus dicatat ini adalah poin sekunder. Bandingkan keluaran dari df.groupby('key').size()dan dari df.groupby('key').count()untuk DataFrame dengan beberapa Seri. Perbedaannya jelas: countberfungsi seperti fungsi agregat lainnya ( mean, max...) tetapi sizekhusus untuk mendapatkan jumlah entri indeks dalam grup, dan oleh karena itu tidak melihat nilai dalam kolom yang tidak ada artinya untuk fungsi ini. Lihat jawaban @ cs95 untuk penjelasan yang akurat.
menit

Jawaban:

108

sizetermasuk NaNnilai, counttidak:

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
sumber
6
Saya pikir hitungan itu juga mengembalikan DataFrame sementara ukuran Seri?
Mr_and_Mrs_D
1
Fungsi .size () mendapatkan nilai agregat dari kolom tertentu hanya sementara .column () digunakan untuk setiap kolom.
Nachiket
Ukuran @Mr_and_Mrs_D mengembalikan integer
boardtc
@boardtc df.size mengembalikan angka - metode groupby dibahas di sini, lihat tautan dalam pertanyaan.
Mr_and_Mrs_D
Adapun pertanyaan saya - jumlah dan ukuran memang mengembalikan DataFrame dan Seri masing-masing ketika "terikat" ke contoh DataFrameGroupBy - dalam pertanyaan terikat ke SeriesGroupBy sehingga mereka berdua mengembalikan contoh Seri
Mr_and_Mrs_D
29

Apa perbedaan antara ukuran dan jumlah pada panda?

Jawaban lain menunjukkan perbedaannya, namun tidak sepenuhnya akurat untuk mengatakan " sizemenghitung NaN sementara counttidak". Meskipun sizememang menghitung NaN, ini sebenarnya adalah konsekuensi dari fakta yang sizemengembalikan ukuran (atau panjang) objek yang dipanggil. Secara alami, ini juga termasuk baris / nilai yang merupakan NaN.

Jadi, untuk meringkas, sizekembalikan ukuran Seri / 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

... sambil countmenghitung nilai non-NaN:

df.A.count()
# 3 

Perhatikan bahwa itu sizeadalah atribut (memberikan hasil yang sama dengan len(df)atau len(df.A)). countadalah sebuah fungsi.

1. DataFrame.sizejuga merupakan atribut dan mengembalikan jumlah elemen di DataFrame (baris x kolom).


Perilaku dengan GroupBy- Struktur Output

Selain perbedaan dasar, ada juga perbedaan dalam struktur output yang dihasilkan saat memanggil 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

Mempertimbangkan,

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

A
a    3
b    2
c    3
dtype: int64

Melawan,

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

   B
A   
a  2
b  0
c  2

GroupBy.countmengembalikan DataFrame saat Anda memanggil countsemua kolom, sementara GroupBy.sizemengembalikan Seri.

Alasannya sizeadalah sama untuk semua kolom, jadi hanya satu hasil yang dikembalikan. Sementara itu, countdipanggil untuk setiap kolom, karena hasilnya akan bergantung pada berapa banyak NaN yang dimiliki setiap kolom.


Perilaku dengan pivot_table

Contoh lainnya adalah bagaimana pivot_tablememperlakukan data ini. Misalkan kita ingin menghitung tabulasi silang dari

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

Dengan pivot_table, Anda dapat mengeluarkan 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

Tapi counttidak berhasil; DataFrame kosong dikembalikan:

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

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

Saya yakin alasannya adalah yang 'count'harus dilakukan pada rangkaian yang diteruskan ke valuesargumen, dan ketika tidak ada yang dilewatkan, panda memutuskan untuk tidak membuat asumsi.

cs95
sumber
7

Hanya untuk menambahkan sedikit ke jawaban @ Edchum, meskipun data tidak memiliki nilai NA, hasil count () lebih bertele-tele, menggunakan contoh sebelumnya:

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
Gelembung Gelembung Gelembung Gut
sumber
Tampaknya sizesetara dengan elegan countdi panda.
QM.py
@ QM.py TIDAK, ini bukan. Alasan perbedaan groupbyoutput dijelaskan di sini .
cs95
1

Ketika kita berurusan dengan dataframe normal maka hanya perbedaan yang akan dimasukkan nilai NAN, berarti hitungan tidak termasuk nilai NAN saat menghitung baris.

Tetapi jika kita menggunakan fungsi-fungsi ini dengan groupbythen, untuk mendapatkan hasil yang benar, count()kita harus mengaitkan bidang numerik dengan the groupbyuntuk mendapatkan jumlah yang tepat dari grup di mana untuk size()jenis asosiasi ini tidak diperlukan.

Mukul Taneja
sumber
0

Selain semua jawaban di atas, saya ingin menunjukkan satu perbedaan lagi yang menurut saya signifikan.

Anda dapat menghubungkan Datarameukuran dan jumlah Panda dengan Vectorsukuran dan panjang Java . Saat kita membuat vektor, beberapa memori yang telah ditentukan dialokasikan untuk itu. ketika kita mendekati jumlah elemen yang dapat ditempati saat menambahkan elemen, lebih banyak memori dialokasikan untuk itu. Demikian pula, DataFramesaat kita menambahkan elemen, memori yang dialokasikan padanya meningkat.

Atribut ukuran memberikan jumlah sel memori yang dialokasikan DataFramesedangkan count memberikan jumlah elemen yang sebenarnya ada DataFrame. Sebagai contoh, masukkan deskripsi gambar di sini

Anda bisa melihat meskipun ada 3 baris DataFrame, ukurannya 6.

Jawaban ini mencakup perbedaan ukuran dan hitungan sehubungan dengan DataFramedan tidak Pandas Series. Saya belum memeriksa apa yang terjadi denganSeries

drp
sumber