Python中将Yes/No转换为1/0失败求助:所有值均转为1
解决Y/N列转换为0/1时全变为1的问题
看起来你的问题核心是目标列的字符串里藏着前导/尾随空格,导致你写的x=='N'判断永远不成立,所有值都走到了else分支变成1。从你贴的数据输出里能看到,每个值前面都有空格(比如 1 N里的N前面带空格),这就是问题的根源。
下面是具体的排查和解决步骤:
第一步:确认问题根源
先执行这段代码,看看去重后的值到底是什么:
print(sample['colval'].str.strip().unique())
如果输出是['N' 'Y'],就实锤了原数据的字符串带空格,直接判断x=='N'肯定匹配不上。
第二步:修复转换逻辑
这里给你三种可行的解决方案:
方案一:在原有lambda里加空格处理
修改你原来的代码,对每个值先做strip()去除前后空格再判断:
sample['colval'] = sample['colval'].apply(lambda x: 0 if x.strip() == 'N' else 1)
方案二:先清洗列再映射(更清晰)
先整列清洗掉空格,再用字典做映射,可读性更强,还能发现异常值:
# 第一步:清洗列,去除所有前后空格 sample['colval'] = sample['colval'].str.strip() # 第二步:用字典把N/Y转成0/1(非N/Y的值会变成NaN,方便排查) sample['colval'] = sample['colval'].map({'N': 0, 'Y': 1})
方案三:用numpy.where简化代码
如果你习惯用numpy的工具,这种写法更简洁高效:
import numpy as np sample['colval'] = np.where(sample['colval'].str.strip() == 'N', 0, 1)
第三步:验证转换结果
最后执行这段代码确认结果是否符合预期:
print(sample['colval'].value_counts())
按照你给的示例数据,应该会输出0 18和1 2,说明转换完全正确。
内容的提问来源于stack exchange,提问作者Tia
相关产品推荐
相关产品推荐

