如何对仅部分组匹配的分组DataFrame执行相加操作?
解决多索引DataFrame按组相加的问题
核心问题分析
你遇到的问题主要源于两点:
- 两个DataFrame的分组列名不一致:df1第一列是
pitch_type,df2是pitch type,导致多索引无法正确对齐。 - 若多索引的层级顺序不统一,也会造成
add方法无法匹配对应分组。
解决方案
步骤1:统一列名
先将两个DataFrame的分组列名改成一致,确保索引层级名称完全匹配:
import pandas as pd # 统一df2的列名与df1对齐 df2 = df2.rename(columns={"pitch type": "pitch_type"})
步骤2:确保多索引结构一致
如果你的DataFrame还未设置多索引,先将三个分组列设为多索引;若已是多索引,确认层级顺序为['pitch_type', 'zone', 'description']:
# 设置多索引(未设置时执行) df1 = df1.set_index(['pitch_type', 'zone', 'description']) df2 = df2.set_index(['pitch_type', 'zone', 'description'])
步骤3:执行相加操作
方法一:使用add方法
利用fill_value=0保留无匹配的分组,最后重置索引并转换数值类型:
result_df = df1.add(df2, fill_value=0).reset_index() # 将数值列转为整数(避免出现浮点数) result_df[0] = result_df[0].astype(int)
方法二:使用concat+groupby求和(更直观)
合并两个DataFrame后按分组求和,自动保留所有分组:
combined_df = pd.concat([df1, df2]) result_df = combined_df.groupby(['pitch_type', 'zone', 'description']).sum().reset_index()
最终结果
执行后得到的DataFrame将完全符合预期:
| pitch_type | zone | description | 0 |
|---|---|---|---|
| CH | 1.0 | hit_by_pitch | 4 |
| CH | 1.0 | ball | 6 |
| CH | 2.0 | swinging_strike | 1 |
| CH | 3.0 | ball | 1 |
| CU | 2.0 | hit_by_pitch | 6 |
内容的提问来源于stack exchange,提问作者Jackson Prettyman
相关产品推荐
相关产品推荐

