pandas多列用列表推导式转非NaN为1失效原因及解决方案
底层原因
多列批量写法不生效的核心原因是pandas中迭代DataFrame和迭代Series的默认行为不一样:
- 当你迭代
test['animal1']这类单列Series对象时,迭代操作返回的是每一行的单元格值,所以列表推导式可以逐值判断是否等于'0',最终得到和行数长度一致的0/1列表,赋值后结果符合预期。 - 当你迭代
test[op]这类多列DataFrame对象时,迭代操作默认返回的是列名字符串,也就是遍历得到的x实际是'animal1'、'animal2'两个值,二者都不等于'0',所以列表推导式最终得到的是[1,1]。pandas赋值时会把这个长度为2的列表广播到所有行所有列,就出现了全为1的错误结果。
可行的多列批量处理方案
提供两种常用方案,均无需逐列手动编码:
方案1:向量化操作(最高效,推荐)
直接用pandas的向量化判断,不需要任何循环:
# 基于你已经转成字符串的DataFrame处理 test[op] = (test[op] != '0').astype(int)
如果你的需求就是原DataFrame中非NaN值转1、NaN转0,其实不需要提前做fillna和转字符串的操作,一步即可完成:
# 直接针对原始DataFrame处理,更简洁 test[op] = test[op].notna().astype(int)
方案2:apply批量处理每一列
如果你确实需要沿用列表推导式的逻辑,可以用apply遍历每一列处理:
test[op] = test[op].apply(lambda col: [1 if x != '0' else 0 for x in col])
内容的提问来源于stack exchange,提问作者Jameson
相关产品推荐
相关产品推荐

