บทความนี้สาธิตวิธีใช้ GroupBy คำนวณผลรวมของค่าบวกและค่าลบแยกกันในแต่ละกลุ่ม
โค้ดตัวอย่าง
import pandas as pd
# สร้าง DataFrame: สถานที่และอุณหภูมิ (มีทั้งบวกและลบ)
dataFrame = pd.DataFrame({
'Place': ['Chicago', 'Denver', 'Atlanta', 'Chicago', 'Dallas', 'Denver', 'Dallas', 'Atlanta'],
'Temperature': [-2, 30, -5, 10, 30, -5, 20, -10]
})
print("DataFrame ต้นฉบับ:")
print(dataFrame)
# จัดกลุ่มตาม Place
groupRes = dataFrame.groupby(dataFrame['Place'])
# ฟังก์ชัน Lambda สำหรับผลรวมค่าบวกและลบ
def plus(val):
return val[val > 0].sum()
def minus(val):
return val[val < 0].sum()
# ใช้ agg() กับฟังก์ชันที่กำหนดเอง
result = groupRes['Temperature'].agg([('negTemp', minus), ('posTemp', plus)])
print("\nผลรวมค่าลบและค่าบวกแยกกัน:")
print(result)
ผลลัพธ์
DataFrame ต้นฉบับ:
Place Temperature
0 Chicago -2
1 Denver 30
2 Atlanta -5
3 Chicago 10
4 Dallas 30
5 Denver -5
6 Dallas 20
7 Atlanta -10
ผลรวมค่าลบและค่าบวกแยกกัน:
negTemp posTemp
Place
Atlanta -15 0
Chicago -2 10
Dallas 0 50
Denver -5 30
อธิบาย Logic
val[val > 0]กรองเฉพาะค่าบวกในกลุ่ม.sum()รวมค่าที่กรองได้agg([('name', func), ...])ใช้หลายฟังก์ชันพร้อมกันและตั้งชื่อคอลัมน์ผลลัพธ์
วิธีทางเลือก: ใช้ Lambda โดยตรง
result = groupRes['Temperature'].agg(
negTemp=lambda x: x[x < 0].sum(),
posTemp=lambda x: x[x > 0].sum()
)
print(result)
การขยาย: เพิ่มสถิติอื่นๆ
result = groupRes['Temperature'].agg(
count=('Temperature', 'size'),
neg_sum=('Temperature', lambda x: x[x < 0].sum()),
pos_sum=('Temperature', lambda x: x[x > 0].sum()),
neg_count=('Temperature', lambda x: (x < 0).sum()),
pos_count=('Temperature', lambda x: (x > 0).sum()),
mean=('Temperature', 'mean')
)
print(result)
การประยุกต์ใช้
- Financial: กำไร/ขาดทุนแยกตามสาขา
- Physics: แรง/ความเร็ว ทิศทางบวก/ลบ
- Quality Control: ค่าสูง/ต่ำกว่ามาตรฐาน
- Sentiment Analysis: Positive/Negative Scores