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

如何在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_typebudgetmodel
yt1mod
fb2mod
ig3mod
tik tok4unmod
yt5mod
fb6mod
ig1mod
tik tok2unmod

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:03:26