如何在Pandas中通过字符串字典映射创建新列?遇NaN问题求解
DataFrame映射标签全为NaN的问题处理
1. 问题原因
map()方法的逻辑是用Series中的值作为键去查找字典,但你定义的mod_unmod字典是标签("mod"/"unmod")对应媒体类型列表,键是标签,值是媒体类型集合。当用media_type里的"yt"、"fb"等去查字典时,字典里根本没有这些键,所以全部返回NaN。和是否是数字映射无关,纯粹是字典的键值方向搞反了。
2. 实现期望输出的方法
有两种常用方案:
方案一:反转字典结构
先把mod_unmod转换成媒体类型→标签的映射字典,再用map():
# 反转字典,生成{媒体类型: 标签}的结构 reverse_map = {val: key for key, vals in mod_unmod.items() for val in vals} df["model"] = df["media_type"].map(reverse_map)
方案二:使用np.select
通过定义条件列表和对应标签列表来匹配:
import numpy as np conditions = [ df["media_type"].isin(mod_unmod["mod"]), df["media_type"].isin(mod_unmod["unmod"]) ] choices = ["mod", "unmod"] df["model"] = np.select(conditions, choices)
执行后得到的目标结果:
| media_type | budget | model |
|---|---|---|
| yt | 1 | mod |
| fb | 2 | mod |
| ig | 3 | mod |
| tik tok | 4 | unmod |
| yt | 5 | mod |
| fb | 6 | mod |
| ig | 1 | mod |
| tik tok | 2 | unmod |
3. 是否为重复问题
属于Stack Overflow上的常见问题,核心是多值分组映射或字典键值反转实现映射,已有大量类似提问和解答,本质是重复问题的场景变体。
4. 多标签场景的处理方法
如果有三个标签(比如"to test"、"testing"、"untested"),逻辑和双标签一致,两种方案都可以扩展:
方案一:反转字典
multi_tag = { "to test": ["a", "b"], "testing": ["c", "d"], "untested": ["e", "f"] } reverse_multi_map = {val: key for key, vals in multi_tag.items() for val in vals} df["tag"] = df["media_type"].map(reverse_multi_map)
方案二:扩展np.select的条件和选项
conditions = [ df["media_type"].isin(multi_tag["to test"]), df["media_type"].isin(multi_tag["testing"]), df["media_type"].isin(multi_tag["untested"]) ] choices = ["to test", "testing", "untested"] df["tag"] = np.select(conditions, choices)
内容的提问来源于stack exchange,提问作者Andrea Ciufo
相关产品推荐
相关产品推荐

