You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

代码说明

  1. 长表转宽表:pivot方法将df1中EVENT_TYPE的不同取值转为列,DAMAGE作为对应列的值,索引设为STATE和YEAR,确保和df2的主键匹配。
  2. 列名统一:用rename(columns=str.upper)将事件类型列名转为大写,避免因大小写差异导致的列不匹配。
  3. 填充NaN:combine_first方法会优先保留df2的原有数据(若存在非空值),仅用df1透视表中的值填充df2的NaN位置,完全符合需求。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:40:30