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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:15:41