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

