如何在DataFrame列中匹配字典键并映射对应值?
问题与解决方案
问题背景
现有DataFrame df1:
|id| domains| name| | 1| life| xyz| | 2| life| hyu| | 3|vkontakete| jik|
以及映射字典:
domain_dict = { "tassagency": "TACC", "life": "LIFE.ru", "ria": "RIA | Taza", "nws_ru" : "NEWS.ru | Новости", "mash" :"Mash | Мэш" }
需要实现:将df1的domains列值与domain_dict的键匹配,匹配成功则把对应字典值放入新列vk_dom;不匹配则保留domains列原数值,最终期望输出:
|id| domains| name| vk_dom| | 1| life| xyz| LIFE.ru| | 2| life| hyu| LIFE.ru| | 3|vkontakete| jik| vkontakete|
原代码的问题
你尝试的循环写法存在两个关键错误:
- 内层循环重复使用变量
i,覆盖了外层循环的DataFrame索引值,导致逻辑混乱; - 内层循环中,只要遇到一个不匹配的字典键,就会把
vk_dom重置为原domains值,哪怕之前已经匹配成功,最终会被最后一次不匹配的赋值覆盖。
正确实现方式
方法1:Pandas内置映射(推荐,效率高)
用Series.map()做字典映射,不匹配的项会返回NaN,再用fillna()填充原列值:
df1['vk_dom'] = df1['domains'].map(domain_dict).fillna(df1['domains'])
方法2:Lambda表达式+字典get方法
用apply()结合字典的get()方法,直接指定匹配不到时返回原值:
df1['vk_dom'] = df1['domains'].apply(lambda x: domain_dict.get(x, x))
方法3:修复后的循环写法(不推荐,大数据集效率低)
如果一定要用循环,先默认赋值原列值,再遍历匹配替换:
import numpy as np df1["vk_dom"] = df1['domains'] # 先设为原值 for idx in df1.index: current_domain = df1['domains'][idx] if current_domain in domain_dict: df1["vk_dom"][idx] = domain_dict[current_domain]
内容的提问来源于stack exchange,提问作者pp45
相关产品推荐
相关产品推荐

