Python3字符串转数字:指定字符串转1其余转0的代码异常问题
问题分析与修复方案
嘿,我来帮你搞定这个问题!你这段代码执行后全变成0,核心原因是类型不匹配:
你用df.name.replace({"a" : 1, "b" :1}, inplace = True)把"a"和"b"替换成了整数1,但后面的lambda表达式里却在判断x != '1'(字符串类型的'1')。整数1和字符串'1'是完全不同的类型,判断结果永远是True,所以所有值都被转换成0了。
下面给你几种可行的修复方案,从简单到高效:
方案1:统一替换的类型
把replace的目标值改成字符串'1',让后续判断的类型一致:
import pandas as pd df = pd.DataFrame({'name' : list('abcdefghi')}) # 替换为字符串'1',保持类型统一 df.name.replace({"a" : '1', "b" :'1'}, inplace = True) df['name'] = df['name'].apply(lambda x:0 if x!='1' else int(x))
方案2:用向量化操作实现(推荐)
Pandas的向量化操作比逐行的apply高效得多,尤其适合大数据量场景。直接用isin判断元素是否在目标列表,再转成整数:
import pandas as pd df = pd.DataFrame({'name' : list('abcdefghi')}) # isin返回布尔值,astype(int)自动把True转1,False转0 df['name'] = df['name'].isin(['a', 'b']).astype(int)
方案3:用numpy的where函数
如果你习惯用numpy的逻辑判断,也可以这样写:
import pandas as pd import numpy as np df = pd.DataFrame({'name' : list('abcdefghi')}) # 满足条件返回1,否则返回0 df['name'] = np.where(df['name'].isin(['a', 'b']), 1, 0)
这几种方案都能实现你想要的效果:将特定字符串(a、b)转为1,其余转为0,其中方案2是最符合Pandas最佳实践的写法哦!
内容的提问来源于stack exchange,提问作者ybin
相关产品推荐
相关产品推荐

