将Housing数据集yes/no转0/1时,应用二进制映射出现NaN问题排查
问题原因及解决办法
出现NaN的核心原因是你的映射字典没有匹配到数据中的实际值,常见两种情况:
- 字符串大小写不匹配:比如数据里存的是
"Yes"、"NO"或者大小写混合格式,而映射字典只写了小写的"yes"和"no",匹配失败就会返回NaN。 - 数据中存在非
yes/no的其他值:比如空字符串、带空格的" yes "、拼写错误的字符串(如"ye"),这些值不在映射字典范围内,同样会生成NaN。
验证问题的方法
先检查目标列的所有唯一值,确认是否存在不匹配的情况:
for col in varlist: print(f"列 {col} 的唯一值:", housing[col].unique())
解决办法
方法1:统一字符串大小写后再映射
先把所有字符串转成小写(或大写),再执行映射,解决大小写不匹配问题:
def binary_map(x): return x.str.lower().map({"yes": 1, "no": 0}) housing[varlist] = housing[varlist].apply(binary_map)
方法2:直接用replace替换(更简洁)
replace支持多键值对替换,可直接处理多种大小写变体:
replace_dict = {"yes":1, "no":0, "Yes":1, "NO":0, "YES":1, "No":0} housing[varlist] = housing[varlist].replace(replace_dict)
方法3:处理带空格的异常值
如果数据里有带前后空格的" yes ",先去除空格再映射:
def binary_map(x): return x.str.strip().str.lower().map({"yes": 1, "no": 0}) housing[varlist] = housing[varlist].apply(binary_map)
方法4:保留/统一处理无法匹配的值
如果不想丢弃非yes/no的值,可保留原内容或统一设为固定值:
# 保留无法匹配的原内容 housing[varlist] = housing[varlist].apply(lambda x: x.map({"yes":1, "no":0}).fillna(x)) # 把无法匹配的值统一设为0 housing[varlist] = housing[varlist].apply(lambda x: x.map({"yes":1, "no":0}).fillna(0))
内容的提问来源于stack exchange,提问作者kzs
相关产品推荐
相关产品推荐

