Python pandas计算两年度职业行业DataFrame差值生成目标表
按OCC+IND匹配计算两年行业职业数据差值的实现方案
原按行位置相减的逻辑仅适用于两个表行数、行顺序完全对齐的场景,无法适配编码不匹配、行数不一致的情况,正确实现步骤如下:
- 统一两个年份DataFrame的列名,剥离年份后缀方便关联匹配
import pandas as pd # 示例数据初始化(和提供的测试数据一致) d = {'OCC2005': [1234, 1234, 1234 ,1234, 2357,2357,2357,2357, 4321,4321,4321,4321, 3333], 'IND2005': [4, 5, 6, 7, 5,6,7,4, 6,7,5,4,5], 'Result': [7, 8, 12, 1, 11,15,20,1,5,12,8,4,3]} df = pd.DataFrame(data=d) d2 = {'OCC2006': [1234, 1234, 1234 ,1234, 2357,2357,2357,2357, 4321,4321,4361,4321, 3333,4444], 'IND2006': [4, 5, 6, 7, 5,6,7,4, 6,7,5,4,5,8], 'Result': [17, 18, 12, 1, 1,5,20,1,5,2,18,4,0,15]} df2 = pd.DataFrame(data=d2) # 重命名列,统一关联键和数值列标识 df_2005 = df.rename(columns={'OCC2005':'OCC', 'IND2005':'IND', 'Result':'result_2005'}) df_2006 = df2.rename(columns={'OCC2006':'OCC', 'IND2006':'IND', 'Result':'result_2006'})
- 按OCC、IND两个字段组合匹配合并数据,可根据业务需求选择连接方式:
how='inner':仅保留两年同时存在的OCC+IND组合how='outer':保留两年所有出现过的OCC+IND组合,单年无数据的位置会填充空值how='left'/how='right':分别保留左表(2005年)/右表(2006年)的全部组合
merged = pd.merge( df_2005, df_2006, on=['OCC', 'IND'], how='outer' )
- 处理缺失值并计算最终差值
如果选择outer连接,单年不存在的记录数值可按业务规则填充,比如无数据的年份结果记为0:
# 缺失值填充,不需要保留单年记录可跳过这步,改用inner连接即可 merged[['result_2005', 'result_2006']] = merged[['result_2005', 'result_2006']].fillna(0) # 计算差值:2006年结果减2005年结果,正值为增长,负值为下降 merged['final_result'] = merged['result_2006'] - merged['result_2005']
- 提取目标字段得到最终结果表
final_df = merged[['OCC', 'IND', 'final_result']].reset_index(drop=True) print(final_df)
用示例数据运行后,会自动正确匹配所有组合:比如仅在2006年存在的OCC=4361/IND=5、OCC=4444/IND=8都会被正确识别,不会出现行错位计算的问题。
内容的提问来源于stack exchange,提问作者JohnV
相关产品推荐
相关产品推荐

