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
相关产品推荐
相关产品推荐

