如何在pandas中计算多列数据占分组小计的百分比?
报错原因
x.sum()返回的是包含sales、cost两列求和结果的Series对象,不是单个数值,无法直接转换为float类型,因此触发类型错误。
修复方案
写法1:修改原apply逻辑
删除多余的float()转换,pandas会自动按列对齐做除法运算:
import numpy as np import pandas as pd df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 'office_id': list(range(1, 7)) * 2, 'sales': [np.random.randint(100000, 999999) for _ in range(12)], 'cost': [np.random.randint(1000, 9999) for _ in range(12)]}) state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum', 'cost': 'sum'}) # 仅修改这一行,去掉float()转换即可 state_pcts = state_office.groupby(level=0).apply(lambda x: 100 * x / x.sum())
写法2:更高效的transform实现
用groupby.transform直接生成和原数据同结构的分组求和结果,运算性能比apply更高:
state_pcts = 100 * state_office / state_office.groupby(level=0).transform('sum')
结果验证
执行state_pcts.groupby(level=0).sum()可以看到每个state分组下的sales、cost列求和结果均为100,符合占比计算预期。
内容的提问来源于stack exchange,提问作者Y.M.
相关产品推荐
相关产品推荐

