如何正确对pandas DataFrame执行groupby操作实现薪资按年度及财年汇总
Pandas薪资统计输出解决方案
原代码问题说明
- 方法1调用
pivot_table时未指定index和values参数,导致输出格式不符合要求 - 方法2存在未定义变量
gp,且参数配置错误,无法得到正确结果
1. 自然年(1月-12月)薪资统计实现
输出格式为:行是员工ID,列是各自然年的薪资总和,空值默认填充0
# 按员工ID+自然年分组,计算薪资总和 year_sum = emp_df.groupby(["empid", "year"], as_index=False)["salary"].sum() # 透视转换为期望的宽表格式 calendar_result = year_sum.pivot( index="empid", columns="year", values="salary" ).fillna(0).reset_index() # 清除列名层级,重命名列更易读 calendar_result.columns.name = None calendar_result = calendar_result.rename( columns={col: f"{col}_total_salary" for col in calendar_result.columns if col != "empid"} ) print(calendar_result)
运行上述代码后输出结果如下:
| empid | 2019_total_salary | 2020_total_salary | 2021_total_salary |
|---|---|---|---|
| 101 | 0 | 2000 | 3500 |
| 102 | 3000 | 0 | 4000 |
2. 财年(4月-次年3月)薪资统计实现(扩展)
# 月份映射为数字,方便判断财年归属 month_num_map = { 'Jan':1, 'Feb':2, 'Mar':3, 'Apr':4, 'May':5, 'Jun':6, 'Jul':7, 'Aug':8, 'Sep':9, 'Oct':10, 'Nov':11, 'Dec':12 } emp_df['month_num'] = emp_df['month'].map(month_num_map) # 计算财年:4月及之后归属当前年财年,1-3月归属上一年财年 emp_df['fiscal_year'] = emp_df.apply( lambda x: x['year'] if x['month_num'] >=4 else x['year'] - 1, axis=1 ) # 后续逻辑和自然年统计一致 fiscal_sum = emp_df.groupby(["empid", "fiscal_year"], as_index=False)["salary"].sum() fiscal_result = fiscal_sum.pivot( index="empid", columns="fiscal_year", values="salary" ).fillna(0).reset_index() fiscal_result.columns.name = None fiscal_result = fiscal_result.rename( columns={col: f"FY{col}_total_salary" for col in fiscal_result.columns if col != "empid"} ) print(fiscal_result)
内容的提问来源于stack exchange,提问作者Shivkumar kondi
相关产品推荐
相关产品推荐

