如何在Pandas中将单元格值匹配到列名合并两个DataFrame?
解决方案
问题根源在于:df1的Year是数值类型,而df2的年份是字符串格式的列名,两者无法直接通过merge关联;concat仅适用于同结构表的拼接,自然也达不到需求。正确思路是先把df2从宽表转为和df1结构一致的长表,再进行合并。
步骤1:将df2从宽表转成纵向长表
使用pandas的melt函数,把横向的年份列转为纵向的Year列,同时提取对应值作为Value列:
df2_long = df2.melt( id_vars='Code', # 保留Code作为匹配标识 var_name='Year', # 原年份列名转为Year列 value_name='Value' # 原年份列的值转为Value列 )
转换后的df2_long结构如下:
Code Year Value ALB 2000 1m ALB 2001 2m ALB 2002 3m ARG 2000 2m ARG 2001 4m ARG 2002 6m
步骤2:统一Year列的数据类型
df1的Year是数值类型(如int),而df2_long的Year是字符串,需转为相同类型才能正确匹配:
df2_long['Year'] = df2_long['Year'].astype(int)
步骤3:合并两个DataFrame
此时两个表结构一致,通过merge按Code和Year做左连接,确保保留df1的所有行:
df_result = df1.merge(df2_long, on=['Code', 'Year'], how='left')
完整可运行代码
import pandas as pd # 模拟输入数据 df1 = pd.DataFrame({ 'Code': ['ALB', 'ALB', 'ALB', 'ARG', 'ARG', 'ARG'], 'Year': [2000, 2001, 2002, 2000, 2001, 2002] }) df2 = pd.DataFrame({ 'Code': ['ALB', 'ARG'], '2000': ['1m', '2m'], '2001': ['2m', '4m'], '2002': ['3m', '6m'] }) # 宽表转长表 df2_long = df2.melt(id_vars='Code', var_name='Year', value_name='Value') # 统一Year类型 df2_long['Year'] = df2_long['Year'].astype(int) # 合并表 df_result = df1.merge(df2_long, on=['Code', 'Year'], how='left') print(df_result)
运行后输出结果完全符合预期:
Code Year Value 0 ALB 2000 1m 1 ALB 2001 2m 2 ALB 2002 3m 3 ARG 2000 2m 4 ARG 2001 4m 5 ARG 2002 6m
内容的提问来源于stack exchange,提问作者dch2404
相关产品推荐
相关产品推荐

