Python Pandas判断列含'X'赋值时所有结果均为YES的问题
问题根因
你的代码存在两处逻辑错误,是导致Column2全为'YES'的直接原因:
- 循环内的判断条件
df['Column1'].str.contains('X').any()作用范围是整个Column1列:只要整列里存在任意一个包含'X'的单元格,该条件就返回True,完全没有和当前遍历的行做关联 - 条件分支内直接对整列
df['Column2']赋值,而非针对当前行修改值,最终全列会被最后一次循环的判断结果覆盖,自然所有行值一致。
另外pandas做这类逐行条件赋值不需要手写for循环,向量化实现性能比循环高几个量级,也不容易写错。
正确代码
推荐方案(向量化实现,生产环境首选)
借助numpy.where做批量条件判断赋值即可,一行代码搞定:
import numpy as np # 若Column1存在空值,添加na=False参数可避免contains返回空值导致报错 df['Column2'] = np.where( df['Column1'].str.contains('X', na=False), 'YES', 'NO' )
循环实现(仅作逻辑演示)
注意:该写法性能极差,数据量大时运行速度会比向量化写法慢几十到上百倍,非必要不要使用
for idx, row in df.iterrows(): if 'X' in str(row['Column1']): df.loc[idx, 'Column2'] = 'YES' else: df.loc[idx, 'Column2'] = 'NO'
内容的提问来源于stack exchange,提问作者Karolina
相关产品推荐
相关产品推荐

