如何用Pandas将Year设为索引、Job Title设为字段重构DataFrame
Pandas 数据透视表实现按年份和职位整理薪资数据
问题场景
现有如下Pandas DataFrame:
Index Job Title Year Salary 0 POL - POL 47 HQ Police Chief 2022 243000 1 POL - POL 47 HQ Police Chief 2023 258000 2 CAT - CAT 30 County Attorney 2022 220000 3 CAT - CAT 30 County Attorney 2022 236000 4 CAT - CAT 30 County Attorney 2023 258000 5 DOT - DOT 50 Director 2022 228000 6 DOT - DOT 50 Director 2023 244000 7 POL - HQ Police Chief 2019 239566 8 POL - HQ Police Chief 2020 225000 9 POL - HQ Police Chief 2021 236000 10 IGR - IGR 20 Director 2022 232000 11 IGR - IGR 20 Director 2023 232000 12 FIN - FIN 32 Director 2022 220000 13 FIN - FIN 32 Director 2023 236000 14 PRO - PRO 35 Procurement Director 2022 220000
需实现:
- 将唯一
Year值设为索引 - 将唯一
Job Title设为列名 - 用
Salary值填充对应交叉单元格,无对应值时显示NaN或0
期望效果示例:
POL - HQ Police Chief FIN - FIN 32 Director PRO - PRO 35 Procurement Director 2019 239566 NaN NaN 2020 225000 NaN NaN 2021 236000 NaN NaN 2022 NaN 220000 220000 2023 NaN 236000 NaN
此前尝试常规索引转置操作,结果存在大量重复冗余,无法满足需求。
解决方案
可以用Pandas的pivot_table或pivot方法实现,推荐优先用pivot_table,因为它能自动处理同一(年份+职位)组合下的重复薪资值。
方法1:使用pivot_table(适配有重复组合的场景)
import pandas as pd # 假设你的DataFrame名为df pivoted_df = df.pivot_table( index='Year', columns='Job Title', values='Salary', aggfunc='first' # 取该组合下第一条薪资,可替换为'mean'取平均、'sum'求和等 ) # 若需将NaN替换为0,执行以下代码 # pivoted_df = pivoted_df.fillna(0)
方法2:使用pivot(需确保无重复组合)
如果确认每个(年份+职位)组合仅对应一条薪资数据,或先对数据去重后,可使用pivot:
# 先去除重复的(年份+职位)组合 df_unique = df.drop_duplicates(subset=['Year', 'Job Title']) # 生成交叉表 pivoted_df = df_unique.pivot(index='Year', columns='Job Title', values='Salary')
关键说明
pivot_table的aggfunc参数可按需调整:比如同一职位同一年有多条薪资时,用'mean'计算平均值,'sum'求和,'last'取最后一条记录。- 最终生成的
pivoted_df即为目标结构,年份作为索引,职位作为列,无数据的单元格默认显示NaN,可通过fillna(0)替换为0。
内容的提问来源于stack exchange,提问作者Wesley Sawyer
相关产品推荐
相关产品推荐

