Pandas中Pivot操作误将MSA Code转为行标签,如何保留为列?
问题分析
你想要的是把wage_keys中的工资信息匹配到smaller_df的每一行中,而不是用pivot来重塑表格结构——pivot的作用是将长表转换为宽表,会把指定的index变成行标签,这和你的需求不符。正确的操作应该是数据合并(merge),因为wage_keys本质是一个按MSA Code映射工资的字典表。
解决方案
直接使用Pandas的merge()函数,以MSA Code为关联键,将两个数据框左连接(保留smaller_df的所有行),就能得到你想要的结果:
import pandas as pd # 执行合并操作,保留smaller_df的所有行,匹配对应MSA的工资 result_df = smaller_df.merge(wage_keys, on='MSA Code', how='left') # 可选:将列名重命名为你期望的"Wages" result_df = result_df.rename(columns={'Average Wage': 'Wages'}) # 查看结果 print(result_df.head())
执行后输出会和你期望的完全一致:
MSA Code Line RPP Wages
0 10180 1.0 91.2 71128.571429
1 10180 2.0 97.4 71128.571429
2 10180 3.0 78.7 71128.571429
3 10180 4.0 93.5 71128.571429
4 10420 1.0 90.4 76620.000000
为什么之前的pivot不对?
pivot(index='MSA Code', columns='Line')['RPP']会把MSA Code设为行索引,把不同的Line值作为列,将RPP的值填充进去,这是把长表转成宽表的操作,和你需要的"给每一行添加工资列"的需求完全不同。
如果因为某些原因你一定要先做pivot操作,也可以通过reset_index()把行索引变回列,再进行合并,但这属于绕路操作:
# 先pivot再重置索引 flat_df = smaller_df.pivot(index='MSA Code', columns='Line')['RPP'].reset_index() # 再合并工资数据 result_df = flat_df.merge(wage_keys, on='MSA Code', how='left')
内容的提问来源于stack exchange,提问作者elbillaf
相关产品推荐
相关产品推荐

