基于STATE、YEAR匹配两个DataFrame并填充对应值(Python)
合并DataFrame实现长表转宽表并填充已有结构
问题描述
现有两个DataFrame:
- df1(长表结构):
STATE YEAR EVENT_TYPE DAMAGE ALABAMA 1962 Tornado 27 ALABAMA 1962 Flood 7 ALABAMA 1963 Thunderstorm 12 ...
- df2(宽表空结构):
STATE YEAR TORNADO THUNDERSTORM FLOOD ALABAMA 1962 NaN NaN NaN ALABAMA 1963 NaN NaN NaN ...
需要将两者合并,把df1中的损失值填充到df2对应STATE-YEAR和事件类型的位置,得到最终结果:
STATE YEAR TORNADO THUNDERSTORM FLOOD ALABAMA 1962 27 NaN 7 ...
解决方案
使用Pandas的pivot(长转宽)和combine_first(填充NaN)方法即可实现,步骤如下:
完整代码示例
import pandas as pd # 模拟输入数据(实际使用时替换为你的真实DataFrame) df1 = pd.DataFrame({ 'STATE': ['ALABAMA', 'ALABAMA', 'ALABAMA'], 'YEAR': [1962, 1962, 1963], 'EVENT_TYPE': ['Tornado', 'Flood', 'Thunderstorm'], 'DAMAGE': [27, 7, 12] }) df2 = pd.DataFrame({ 'STATE': ['ALABAMA', 'ALABAMA'], 'YEAR': [1962, 1963], 'TORNADO': [pd.NA, pd.NA], 'THUNDERSTORM': [pd.NA, pd.NA], 'FLOOD': [pd.NA, pd.NA] }) # 1. 将df1转换为与df2结构匹配的宽表 # 统一列名大小写(确保和df2一致,比如df2列名是大写) df1_pivoted = df1.pivot( index=['STATE', 'YEAR'], columns='EVENT_TYPE', values='DAMAGE' ).rename(columns=str.upper).reset_index() # 2. 用df1的填充值覆盖df2的NaN result = df2.set_index(['STATE', 'YEAR']).combine_first(df1_pivoted.set_index(['STATE', 'YEAR'])).reset_index() print(result)
代码说明
- 长表转宽表:
pivot方法将df1中EVENT_TYPE的不同取值转为列,DAMAGE作为对应列的值,索引设为STATE和YEAR,确保和df2的主键匹配。 - 列名统一:用
rename(columns=str.upper)将事件类型列名转为大写,避免因大小写差异导致的列不匹配。 - 填充NaN:
combine_first方法会优先保留df2的原有数据(若存在非空值),仅用df1透视表中的值填充df2的NaN位置,完全符合需求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

