TLDR; Pandas groupby.agg
มีไวยากรณ์ใหม่ที่ง่ายกว่าสำหรับการระบุ (1) การรวมในหลายคอลัมน์และ (2) การรวมหลายรายการในคอลัมน์ ดังนั้นเพื่อทำสิ่งนี้สำหรับแพนด้า> = 0.25ให้ใช้
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
หรือ
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
หมีแพนด้า> = 0.25: การรวมชื่อ
Pandas ได้เปลี่ยนพฤติกรรมของGroupBy.agg
การใช้ไวยากรณ์ที่ใช้งานง่ายมากขึ้นสำหรับการระบุการรวมชื่อ ดูส่วน 0.25 เอกสารเกี่ยวกับการเพิ่มประสิทธิภาพเช่นเดียวกับปัญหาที่เกี่ยวข้อง GitHub GH18366และGH26512
จากเอกสารประกอบ
เพื่อสนับสนุนการรวมเฉพาะคอลัมน์ด้วยการควบคุมชื่อคอลัมน์เอาต์พุตแพนด้ายอมรับไวยากรณ์พิเศษในที่GroupBy.agg()
เรียกว่า“ การรวมชื่อ” โดยที่
- คีย์เวิร์ดคือชื่อคอลัมน์เอาต์พุต
- ค่าคือสิ่งที่มีองค์ประกอบแรกคือคอลัมน์ที่จะเลือกและองค์ประกอบที่สองคือการรวมเพื่อใช้กับคอลัมน์นั้น Pandas ให้แพนด้าชื่อ NamedAgg พร้อมฟิลด์ ['column', 'aggfunc'] เพื่อให้ชัดเจนขึ้นว่าอาร์กิวเมนต์คืออะไร ตามปกติการรวมอาจเป็นนามแฝงที่เรียกได้หรือสตริง
ตอนนี้คุณสามารถส่งทูเพิลผ่านอาร์กิวเมนต์คำหลักได้ tuples เป็นไปตามรูปแบบของ(<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
หรือคุณสามารถใช้pd.NamedAgg
(โดยพื้นฐานแล้วชื่อทูเพิล) ซึ่งทำให้สิ่งต่างๆชัดเจนยิ่งขึ้น
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
มันง่ายกว่าสำหรับ Series เพียงแค่ส่ง aggfunc ไปยังอาร์กิวเมนต์คำหลัก
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
สุดท้ายหากชื่อคอลัมน์ของคุณไม่ใช่ตัวระบุ python ที่ถูกต้องให้ใช้พจนานุกรมพร้อมการคลายแพ็ก:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
นุ่น <0.25
ในเวอร์ชันล่าสุดของแพนด้าที่นำหน้าไม่เกิน 0.24 หากใช้พจนานุกรมเพื่อระบุชื่อคอลัมน์สำหรับเอาต์พุตการรวมคุณจะได้รับ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
การใช้พจนานุกรมเพื่อเปลี่ยนชื่อคอลัมน์เลิกใช้แล้วใน v0.20 ในเวอร์ชันล่าสุดของแพนด้าสามารถระบุได้ง่ายขึ้นโดยการส่งรายการสิ่งที่เพิ่มขึ้น หากระบุฟังก์ชันด้วยวิธีนี้จำเป็นต้องระบุฟังก์ชันทั้งหมดสำหรับคอลัมน์นั้นเป็นคู่ของคู่ (ชื่อฟังก์ชัน)
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
หรือ,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895