如何将按列分组后的DataFrame与同维度DataFrame执行除法运算?
问题:按分组与同维度DataFrame执行除法运算
现有如下Tester DataFrame:
Tester = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'], 'Col2': [1, 1, 2, 2], 'Col3': [1, 1, 2, 2], 'Col4': [1, 1, 2, 2], 'Col5': [1, 1, 2, 2]})
需求:按Col1列对该DataFrame分组后,将每个分组与同维度的Divider DataFrame执行除法运算,Divider数据如下:
Divider = pd.DataFrame({'Col2': [2, 2], 'Col3': [2, 2], 'Col4': [2, 2], 'Col5': [2, 2]})
尝试使用df = Tester.groupby('Col1').div(Divider)报错,期望得到如下输出DataFrame:
output = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'], 'Col2': [0.5, 0.5, 1, 1], 'Col3': [0.5, 0.5, 1, 1], 'Col4': [0.5, 0.5, 1, 1], 'Col5': [0.5, 0.5, 1, 1]})
注意:每个分组(如A、B)与Divider DataFrame维度相同(此例为2×4)
可行实现方法
原因分析
直接使用groupby.div()报错是因为该方法默认按索引对齐,而Divider的索引与分组后的子DataFrame索引不匹配,导致对齐失败。需要通过apply方法手动处理每个分组的运算。
实现代码
import pandas as pd # 初始化原始数据 Tester = pd.DataFrame({'Col1': ['A', 'A', 'B', 'B'], 'Col2': [1, 1, 2, 2], 'Col3': [1, 1, 2, 2], 'Col4': [1, 1, 2, 2], 'Col5': [1, 1, 2, 2]}) Divider = pd.DataFrame({'Col2': [2, 2], 'Col3': [2, 2], 'Col4': [2, 2], 'Col5': [2, 2]}) # 分组执行除法运算 # group_keys=False 避免分组键被设为索引 result = Tester.groupby('Col1', group_keys=False).apply( lambda x: x[['Col2', 'Col3', 'Col4', 'Col5']] / Divider ) # 合并Col1列与运算结果 final_output = pd.concat([Tester['Col1'], result], axis=1) print(final_output)
代码说明
groupby('Col1', group_keys=False):对Col1分组,同时禁止自动将分组键设置为结果的索引,保持原始结构。apply匿名函数:对每个分组的数值列(Col2-Col5)与Divider执行除法,由于两者维度完全一致,会直接按位置进行广播运算。pd.concat:将原始的Col1列与运算后的数值列合并,得到与期望输出一致的结构。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

