Pandas基于多列groupby计算占比并新增列合并至原DataFrame问题
Pandas 分组计算列占比并新增到原DataFrame实现方案
实现逻辑
- 使用
groupby.transform()完成分组聚合结果的行对齐,无需额外合并操作即可直接在原DataFrame上新增列,保留所有原有字段 - 以
['state', 'office_id', 'sales_year']作为分组键,分别对sales、counts列计算分组总和,每行对应值除以分组总和乘以100得到占比
完整可运行代码
import numpy as np import pandas as pd np.random.seed(0) df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 'office_id': list(range(1, 7)) * 2, 'counts': list(range(1, 3)) * 6, 'sales_year': [np.random.randint(2019, 2021) for _ in range(12)], 'sales': [np.random.randint(100000, 999999) for _ in range(12)]}) # 新增sales占比列,round参数可自行调整保留的小数位数 df['aggr_sales'] = (df['sales'] / df.groupby(['state', 'office_id', 'sales_year'])['sales'].transform('sum') * 100).round(2) # 新增counts占比列 df['aggr_counts'] = (df['counts'] / df.groupby(['state', 'office_id', 'sales_year'])['counts'].transform('sum') * 100).round(2) # 输出最终结果 print(df)
补充说明
如果占比计算规则为对应更高层级分组的总和(比如同sales_year下的全局总和),只需修改groupby内的分组键即可,整体实现逻辑不变。
内容的提问来源于stack exchange,提问作者Shekar Tippur
相关产品推荐
相关产品推荐

