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

Pandas中map(dictionary)处理含NaN的DataFrame列失败求助

问题描述

在Pandas中使用map()结合字典替换DataFrame的流派名称时,listed_in1列替换正常,但listed_in2和listed_in3列执行相同操作后全部被NaN填充。这两列包含NaN值及带前导空格的流派名称,多次尝试无法解决。

失败原因

核心问题是字符串匹配不精确:

  • 字典dict_genres_lookup的键是无前后空格的标准流派名称(如"TV Dramas")
  • listed_in2和listed_in3中的流派名称带有前导空格(如" TV Dramas"),与字典键完全不匹配
  • map()函数找不到对应键时会返回NaN,导致有效数据也被替换为NaN;NaN本身不影响,但空格问题覆盖了所有有效条目

修复方案

步骤1:清理字符串空格

先去除listed_in2和listed_in3中字符串的前后空格,同时保留原始NaN值:

# 针对Pandas 1.3.0+版本,使用na_action='ignore'跳过NaN
data['listed_in2'] = data['listed_in2'].str.strip(na_action='ignore')
data['listed_in3'] = data['listed_in3'].str.strip(na_action='ignore')

# 若Pandas版本较低,用lambda处理
# data['listed_in2'] = data['listed_in2'].apply(lambda x: x.strip() if pd.notna(x) else x)
# data['listed_in3'] = data['listed_in3'].apply(lambda x: x.strip() if pd.notna(x) else x)

步骤2:执行映射替换

清理完成后,再用map()执行替换即可正常匹配:

data['listed_in2'] = data['listed_in2'].map(dict_genres_lookup)
data['listed_in3'] = data['listed_in3'].map(dict_genres_lookup)

可选:一步式处理(正则+替换)

也可以用正则替换空格后直接映射,减少代码行数:

data[['listed_in2', 'listed_in3']] = data[['listed_in2', 'listed_in3']].replace(
    {r'^\s+|\s+$': ''}, regex=True
).map(dict_genres_lookup)

验证结果

执行后查看处理后的列,有效条目会正确映射为短流派名称,NaN值保持不变:

print(data[['listed_in2', 'listed_in3']])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:15:38