TLDR; Pandas groupby.agg
có một cú pháp mới, dễ dàng hơn để chỉ định (1) tổng hợp trên nhiều cột và (2) nhiều tổng hợp trên một cột. Vì vậy, để làm điều này cho gấu trúc> = 0,25 , hãy sử dụng
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
HOẶC LÀ
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandas đã thay đổi hành vi GroupBy.agg
ủng hộ một cú pháp trực quan hơn để chỉ định các tập hợp được đặt tên. Xem phần 0,25 tài liệu về Cải tiến cũng như các vấn đề GitHub có liên quan GH18366 và GH26512 .
Từ tài liệu,
Để hỗ trợ tổng hợp theo từng cột cụ thể với quyền kiểm soát tên cột đầu ra, gấu trúc chấp nhận cú pháp đặc biệt trong GroupBy.agg()
, được gọi là "tập hợp được đặt tên", trong đó
- Các từ khóa là tên cột đầu ra
- Các giá trị là các bộ giá trị có phần tử đầu tiên là cột để chọn và phần tử thứ hai là tập hợp để áp dụng cho cột đó. Pandas cung cấp cho pandas.NamedAgg nametuple với các trường ['column', 'aggfunc'] để làm rõ ràng hơn đối số là gì. Như thường lệ, tập hợp có thể là một bí danh có thể gọi hoặc một chuỗi.
Bây giờ bạn có thể chuyển một tuple thông qua các đối số từ khóa. Các bộ giá trị tuân theo định dạng của (<colName>, <aggFunc>)
.
import pandas as pd
pd.__version__
# '0.25.0.dev0+840.g989f912ee'
# Setup
df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
'height': [9.1, 6.0, 9.5, 34.0],
'weight': [7.9, 7.5, 9.9, 198.0]
})
df.groupby('kind').agg(
max_height=('height', 'max'), min_weight=('weight', 'min'),)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Ngoài ra, bạn có thể sử dụng pd.NamedAgg
(về cơ bản là một tập hợp có tên) để làm cho mọi thứ rõ ràng hơn.
df.groupby('kind').agg(
max_height=pd.NamedAgg(column='height', aggfunc='max'),
min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Nó thậm chí còn đơn giản hơn đối với Series, chỉ cần chuyển aggfunc vào một đối số từ khóa.
df.groupby('kind')['height'].agg(max_height='max', min_height='min')
max_height min_height
kind
cat 9.5 9.1
dog 34.0 6.0
Cuối cùng, nếu tên cột của bạn không phải là số nhận dạng python hợp lệ, hãy sử dụng từ điển với việc giải nén:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Gấu trúc <0,25
Trong các phiên bản gần đây hơn của gấu trúc dẫn đến 0,24, nếu sử dụng từ điển để chỉ định tên cột cho kết quả tổng hợp, bạn sẽ nhận được FutureWarning
:
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
Việc sử dụng từ điển để đổi tên cột không được dùng trong v0.20. Trên các phiên bản gấu trúc gần đây hơn, điều này có thể được chỉ định đơn giản hơn bằng cách chuyển một danh sách các bộ giá trị. Nếu chỉ định các hàm theo cách này, tất cả các hàm cho cột đó cần phải được chỉ định dưới dạng bộ giá trị của các cặp (tên, hàm).
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
Hoặc là,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895