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
相关产品推荐
相关产品推荐

