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

Pandas如何根据id从另一个DataFrame选取并插入匹配值

Pandas 按id跨表匹配新增列实现(非merge方案)

如果你不想使用pd.merge,需要实现逐行id自动比对、从df1取对应name值给df2新增列的需求,可以用以下两种方案,均不涉及硬编码id值,完全匹配类SQL where的逐行匹配逻辑。


方案1:字典映射+map匹配(推荐,性能最优)

核心思路是先把df1处理成id到name的键值对映射,再按df2每行的id直接查找对应值,逻辑和逐行比对完全一致,匹配效率远高于全表遍历。

import pandas as pd

# 示例数据构造
a = [{'id':123, 'name': 'AAA'}, {'id':456, 'name': 'BBB'}, {'id':789, 'name': 'TTT'}]
df1 = pd.DataFrame(a)
b = [{'id':123}, {'id':456}]
df2 = pd.DataFrame(b)

# 构建id到name的查找映射
id_name_map = df1.set_index('id')['name'].to_dict()
# 按id匹配赋值
df2['name'] = df2['id'].map(id_name_map)

print(df2)

运行输出:

id name
0  123  AAA
1  456  BBB
  • 若df2中存在df1没有的id,对应name位置会自动填充为NaN,需要自定义默认值可以后续接fillna()方法处理
  • 该方案在十万行以上数据量下性能和pd.merge基本持平,远好于逐行扫描df1的写法

方案2:纯逐行比对写法(完全对齐伪代码逻辑)

如果你需要严格按照「逐行取df2的id,到df1中找id相等的行取name值」的逻辑写,可以直接用列表推导式实现:

df2['name'] = [
    df1.loc[df1['id'] == current_id, 'name'].iloc[0]
    # 处理df2的id在df1不存在的情况
    if not df1.loc[df1['id'] == current_id, 'name'].empty
    else None
    for current_id in df2['id']
]

注意:该写法每处理一行df2的数据就要全量扫描一次df1做条件判断,数据量较大时运行速度会非常慢,仅适合小数据量场景使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:27:30