Jawaban cepat:
Cara paling sederhana untuk mendapatkan jumlah baris per grup adalah dengan menelepon .size()
, yang mengembalikan Series
:
df.groupby(['col1','col2']).size()
Biasanya Anda menginginkan hasil ini sebagai DataFrame
(bukan a Series
) sehingga Anda dapat melakukan:
df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Jika Anda ingin mengetahui cara menghitung jumlah baris dan statistik lainnya untuk setiap grup, baca terus di bawah ini.
Contoh terperinci:
Pertimbangkan contoh kerangka data berikut:
In [2]: df
Out[2]:
col1 col2 col3 col4 col5 col6
0 A B 0.20 -0.61 -0.49 1.49
1 A B -1.53 -1.01 -0.39 1.82
2 A B -0.44 0.27 0.72 0.11
3 A B 0.28 -1.32 0.38 0.18
4 C D 0.12 0.59 0.81 0.66
5 C D -0.13 -1.65 -1.64 0.50
6 C D -1.42 -0.11 -0.18 -0.44
7 E F -0.00 1.42 -0.26 1.17
8 E F 0.91 -0.47 1.35 -0.34
9 G H 1.48 -0.63 -1.14 0.17
Pertama mari kita gunakan .size()
untuk mendapatkan jumlah baris:
In [3]: df.groupby(['col1', 'col2']).size()
Out[3]:
col1 col2
A B 4
C D 3
E F 2
G H 1
dtype: int64
Kemudian mari kita gunakan .size().reset_index(name='counts')
untuk mendapatkan jumlah baris:
In [4]: df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Out[4]:
col1 col2 counts
0 A B 4
1 C D 3
2 E F 2
3 G H 1
Termasuk hasil untuk lebih banyak statistik
Saat Anda ingin menghitung statistik pada data yang dikelompokkan, biasanya akan terlihat seperti ini:
In [5]: (df
...: .groupby(['col1', 'col2'])
...: .agg({
...: 'col3': ['mean', 'count'],
...: 'col4': ['median', 'min', 'count']
...: }))
Out[5]:
col4 col3
median min count mean count
col1 col2
A B -0.810 -1.32 4 -0.372500 4
C D -0.110 -1.65 3 -0.476667 3
E F 0.475 -0.47 2 0.455000 2
G H -0.630 -0.63 1 1.480000 1
Hasil di atas agak menjengkelkan untuk ditangani karena label kolom bersarang, dan juga karena jumlah baris berdasarkan basis kolom.
Untuk mendapatkan kontrol lebih besar atas output, saya biasanya membagi statistik menjadi agregat individu yang kemudian saya gabungkan menggunakan join
. Ini terlihat seperti ini:
In [6]: gb = df.groupby(['col1', 'col2'])
...: counts = gb.size().to_frame(name='counts')
...: (counts
...: .join(gb.agg({'col3': 'mean'}).rename(columns={'col3': 'col3_mean'}))
...: .join(gb.agg({'col4': 'median'}).rename(columns={'col4': 'col4_median'}))
...: .join(gb.agg({'col4': 'min'}).rename(columns={'col4': 'col4_min'}))
...: .reset_index()
...: )
...:
Out[6]:
col1 col2 counts col3_mean col4_median col4_min
0 A B 4 -0.372500 -0.810 -1.32
1 C D 3 -0.476667 -0.110 -1.65
2 E F 2 0.455000 0.475 -0.47
3 G H 1 1.480000 -0.630 -0.63
Catatan kaki
Kode yang digunakan untuk menghasilkan data uji ditunjukkan di bawah ini:
In [1]: import numpy as np
...: import pandas as pd
...:
...: keys = np.array([
...: ['A', 'B'],
...: ['A', 'B'],
...: ['A', 'B'],
...: ['A', 'B'],
...: ['C', 'D'],
...: ['C', 'D'],
...: ['C', 'D'],
...: ['E', 'F'],
...: ['E', 'F'],
...: ['G', 'H']
...: ])
...:
...: df = pd.DataFrame(
...: np.hstack([keys,np.random.randn(10,4).round(2)]),
...: columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
...: )
...:
...: df[['col3', 'col4', 'col5', 'col6']] = \
...: df[['col3', 'col4', 'col5', 'col6']].astype(float)
...:
Penolakan:
Jika beberapa kolom yang Anda agregasikan memiliki nilai nol, maka Anda benar-benar ingin melihat jumlah baris grup sebagai agregasi independen untuk setiap kolom. Kalau tidak, Anda dapat disesatkan mengenai berapa banyak catatan yang sebenarnya digunakan untuk menghitung hal-hal seperti mean karena panda akan menjatuhkan NaN
entri dalam perhitungan rata-rata tanpa memberi tahu Anda tentang hal itu.
df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])