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

Pandas匹配两个DataFrame为面板数据添加危机年份标识列咨询

Pandas 双DataFrame匹配生成危机标识列实现方案

核心思路

先处理df1中逗号分隔的多值危机年份,将其拆解为「国家-单危机年份」的对应关系,再和面板数据df2做匹配即可生成目标列。

代码实现

提供两种常用实现方式,可根据数据量选择:

方式1:字典映射(适合中小数据量,写法简洁)

import pandas as pd

# 1. 生成国家对应危机年份的映射字典
crisis_dict = (
    df1
    # 拆分逗号分隔的年份,空值自动转为NaN
    .assign(Crisis = df1['Crisis'].str.split(',\s*'))
    # 拆分后转为多行
    .explode('Crisis')
    # 过滤无危机年份的空行
    .dropna(subset=['Crisis'])
    # 年份转整数后按国家聚合为集合
    .groupby('Country')['Crisis'].agg(lambda x: set(x.astype(int)))
    .to_dict()
)

# 2. 为df2生成crisis列
df2['crisis'] = df2.apply(
    lambda row: 1 if row['Year'] in crisis_dict.get(row['Country'], set()) else 0,
    axis=1
)

方式2:表连接(适合大数据量,性能更优)

# 1. 将df1处理为「国家-危机年份」长表
df1_long = (
    df1
    .assign(Crisis = df1['Crisis'].str.split(',\s*'))
    .explode('Crisis')
    .dropna(subset=['Crisis'])
    # 字段重命名和类型对齐,新增标识列
    .rename(columns={'Crisis': 'Year'})
    .assign(Year = lambda x: x['Year'].astype(int), crisis = 1)
)

# 2. 左连接匹配年份,空值填充为0
df2 = df2.merge(df1_long, on=['Country', 'Year'], how='left')
df2['crisis'] = df2['crisis'].fillna(0).astype(int)

运行以上任意一种方法,即可得到你给出的预期输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:03