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

Pandas中多列关联并生成_loc后缀列的实现方案咨询

如何将多个DataFrame列关联匹配并添加对应列?

我来给你捋捋怎么实现这个需求——你需要把df1里的每一列(pri、sec0这些)都和df2的name列做匹配,给每个列加上对应的loc值,还要保证原列和新生成的_loc列相邻对吧?

首先咱们先把测试用的DataFrame构造出来,方便后续验证:

import pandas as pd

# 构造df1
df1 = pd.DataFrame({
    'pri': ['ACL', 'ABC', 'XYZ'],
    'sec0': ['EMR', 'MKB', 'LMN'],
    'sec1': ['DFG', 'JKL', 'SDF'],
    'sec2': ['XHD', 'KLF', 'GHY']
})

# 构造df2
df2 = pd.DataFrame({
    'name': ['ACL', 'EMR', 'DFG', 'XHD', 'ABC', 'MKB', 'JKL', 'KLF', 'XYZ', 'LMN', 'SDF', 'GHY'],
    'loc': [12, 23, 431, 48, 55, 699, 70, 82, 93, 10, 235, 53]
})

接下来给你两种实现方式,你可以根据自己的习惯选:

方式一:用映射字典+map(简洁高效)

这种方式适合数据量较大的场景,匹配速度更快:

# 先把df2转成「名称: loc值」的字典,方便快速查找
loc_mapping = df2.set_index('name')['loc'].to_dict()

# 遍历df1的每一列,生成对应的_loc列
for col in df1.columns:
    df1[f'{col}_loc'] = df1[col].map(loc_mapping)

# 调整列顺序,让原列和对应的_loc列挨在一起
new_columns = []
for col in df1.columns[:4]:  # 原df1有4列,取前4个就是pri、sec0这些原列名
    new_columns.append(col)
    new_columns.append(f'{col}_loc')
df1 = df1[new_columns]

# 看看结果
print(df1)

执行后就能得到你想要的输出格式,每一列都跟着对应的_loc列。

方式二:用merge逐列关联

如果你更习惯用merge的方式,也可以逐列和df2做关联,不过代码会稍微繁琐一点:

# 从df1开始,先关联pri列
result = df1.merge(df2, left_on='pri', right_on='name').rename(columns={'loc': 'pri_loc'}).drop('name', axis=1)
# 接着关联sec0列
result = result.merge(df2, left_on='sec0', right_on='name').rename(columns={'loc': 'sec0_loc'}).drop('name', axis=1)
# 依次处理sec1和sec2
result = result.merge(df2, left_on='sec1', right_on='name').rename(columns={'loc': 'sec1_loc'}).drop('name', axis=1)
result = result.merge(df2, left_on='sec2', right_on='name').rename(columns={'loc': 'sec2_loc'}).drop('name', axis=1)

# 最后调整列顺序到预期格式
result = result[['pri', 'pri_loc', 'sec0', 'sec0_loc', 'sec1', 'sec1_loc', 'sec2', 'sec2_loc']]

print(result)

两种方式都能得到你想要的结果,第一种更简洁高效,推荐优先使用~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:37