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

