Câu trả lời nhanh:
Cách đơn giản nhất để có được số lượng hàng cho mỗi nhóm là bằng cách gọi .size()
, trả về a Series
:
df.groupby(['col1','col2']).size()
Thông thường bạn muốn kết quả này là một DataFrame
(thay vì a Series
) để bạn có thể làm:
df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Nếu bạn muốn tìm hiểu cách tính tổng số hàng và số liệu thống kê khác cho mỗi nhóm, hãy tiếp tục đọc phần bên dưới.
Ví dụ chi tiết:
Hãy xem xét các khung dữ liệu mẫu sau:
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
Trước tiên hãy sử dụng .size()
để có được số lượng hàng:
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
Sau đó, hãy sử dụng .size().reset_index(name='counts')
để có được số lượng hàng:
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
Bao gồm kết quả để biết thêm số liệu thống kê
Khi bạn muốn tính toán số liệu thống kê về dữ liệu được nhóm, nó thường trông như thế này:
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
Kết quả ở trên là một chút khó chịu để giải quyết vì các nhãn cột lồng nhau và cũng vì số lượng hàng trên cơ sở mỗi cột.
Để có thêm quyền kiểm soát đầu ra, tôi thường chia các số liệu thống kê thành các tập hợp riêng lẻ mà sau đó tôi kết hợp sử dụng join
. Nó trông như thế này:
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
Chú thích
Mã được sử dụng để tạo dữ liệu thử nghiệm được hiển thị bên dưới:
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)
...:
Tuyên bố từ chối trách nhiệm:
Nếu một số cột mà bạn đang tổng hợp có giá trị null, thì bạn thực sự muốn xem hàng được tính là một tập hợp độc lập cho mỗi cột. Mặt khác, bạn có thể bị nhầm lẫn là có bao nhiêu bản ghi đang thực sự được sử dụng để tính toán những thứ như giá trị trung bình bởi vì gấu trúc sẽ bỏ NaN
các mục trong phép tính trung bình mà không cho bạn biết về nó.
df[['col1','col2','col3','col4']].groupby(['col1','col2']).agg(['mean', 'count'])