如何使用pandas将分散的员工福利列转为以福利名为表头的宽表
Pandas员工福利表结构转换实现方案
实现思路
通过宽表转长表再转目标宽表的逻辑,无需提前获知福利项的具体取值,自动完成结构转换,核心使用pandas内置的wide_to_long和pivot_table函数实现,适配性强。
完整代码示例
import pandas as pd # 假设原始数据存储在df_raw变量中 # 第一步:将配对的Benefit N、Total N列批量转成长格式 df_long = pd.wide_to_long( df_raw, stubnames=["Benefit", "Total"], # 指定配对列的前缀 i=["Country", "Employee Name"], # 指定不变的标识符列作为索引 j="benefit_group", # 后缀序号存储的列名 sep=" " # 前缀和后缀之间的分隔符 ).dropna(subset=["Benefit"]) # 剔除无福利记录的空行 df_long = df_long.reset_index() # 第二步:将长表转成目标宽表,自动生成福利列 df_result = df_long.pivot_table( index=["Country", "Employee Name"], columns="Benefit", # 所有唯一福利项自动转为列名 values="Total", aggfunc="sum" # 若存在同一员工同一福利多条记录,可自定义聚合规则,无重复场景用first也可 ).reset_index().rename_axis(columns=None) # 清除列名的索引标识
方案优势
- 完全不需要提前获知福利项的取值,自动识别所有唯一福利生成对应列
- 扩展性强,后续新增福利组(如Benefit 4+Total 4)无需修改核心逻辑,直接兼容
- 自动过滤无效空值,运算效率高
- 兼容同员工同福利多记录的场景,可灵活调整聚合规则
注:你给出的预期结果中Employee 2的Health Insurance为100.0属于笔误,按原始数据计算结果应为1000.0。
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

