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

Pandas如何基于多列实现数据映射(不使用merge方法)

基于多索引实现Pandas列映射的解决方案

错误原因

你写的代码报错是因为:

  • map方法仅适用于Pandas Series,直接对DataFrame调用会触发索引匹配错误
  • 多索引(MultiIndex)的Series需要接收元组形式的索引键,而不是DataFrame的多列组合

正确实现方式

步骤1:生成多索引映射Series

先对key_df去重并设置多索引,提取出location的映射关系:

import pandas as pd

data_df = pd.DataFrame({'p_id': ['abc@gmail.com','abc@gmail.com','abc@gmail.com','ace@gmail.com','ace@gmail.com','pqr@gmail.com','pqr@gmail.com'],
             'company': ['a','b','c','d','e','f','g'],
             'dept_access':['a1','a1','a1','a1','a2','a2','a2']})

key_df = pd.DataFrame({'p_id': ['abc@gmail.com','xyz@gmail.com','pqr@gmail.com'],
             'company': ['a','c','b'],
             'location':['UK','USA','KOREA']})

# 生成去重后的多索引映射Series
loc_map = key_df.drop_duplicates(['p_id', 'company']).set_index(['p_id', 'company'])['location']

步骤2:将data_df的匹配列转为元组后映射

有两种高效的实现方式:

方式一:使用apply生成元组
data_df['location'] = data_df.apply(lambda row: (row['p_id'], row['company']), axis=1).map(loc_map)
方式二:使用zip生成元组(性能更优)
data_df['location'] = pd.Series(list(zip(data_df['p_id'], data_df['company']))).map(loc_map)

最终结果

运行后data_df的内容:

p_id company dept_access location
0  abc@gmail.com       a          a1       UK
1  abc@gmail.com       b          a1      NaN
2  abc@gmail.com       c          a1      NaN
3  ace@gmail.com       d          a1      NaN
4  ace@gmail.com       e          a2      NaN
5  pqr@gmail.com       f          a2      NaN
6  pqr@gmail.com       g          a2      NaN

原理说明

loc_map的索引是(p_id, company)的元组组合,我们将data_df每一行的p_id和company打包成相同结构的元组后,map方法就能精准匹配到对应的location值,无匹配项则返回NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:36:22