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

pandas从多源DataFrame匹配数据为初始表新增列的实现方法

实现方法

有两种常用方案都可以实现需求,你可以根据自己的数据量大小和数据特征选择:

方案1:宽表转长表合并法(适合数据量较大、无重复匹配键的场景)

核心逻辑是把按年份存为列的宽表df1、df2转换为country、yeardum为联合主键的长表,再和df0按主键合并,代码如下:

import pandas as pd

# 你已有的df0、df1、df2定义代码这里省略,直接运行后续逻辑
# 处理df1转长表
df1_long = df1.melt(
    id_vars='country',
    var_name='yeardum',
    value_name='sales_year_data'
)
# 合并销售数据到df0
df_inv = df0.merge(df1_long, on=['country', 'yeardum'], how='left')

# 处理df2转长表
df2_long = df2.melt(
    id_vars='country',
    var_name='yeardum',
    value_name='country_image_data'
)
# 合并国家印象数据,存在重复匹配时默认保留第一条
df_inv = df_inv.merge(df2_long, on=['country', 'yeardum'], how='left').drop_duplicates(keep='first')

方案2:逐行匹配法(适合数据量小、匹配规则灵活的场景)

直接对df0逐行遍历,匹配df1、df2的对应位置取值,逻辑简单不易出错:

df_inv = df0.copy()

# 匹配sales_year_data列
df_inv['sales_year_data'] = df_inv.apply(
    lambda row: df1.loc[df1['country'] == row['country'], row['yeardum']].iloc[0],
    axis=1
)

# 匹配country_image_data列
df_inv['country_image_data'] = df_inv.apply(
    lambda row: df2.loc[df2['country'] == row['country'], row['yeardum']].iloc[0],
    axis=1
)

运行上述任意一种方案的代码后,得到的df_inv就是你需要的目标结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:07