Python按条件新增列逻辑未生效,新列全为0问题求助
问题排查与解决方案
错误原因
你的代码中data['column2'] = 1、data['column2'] = 0是对整列做全局赋值,每次循环都会覆盖该列所有行的取值。最终column2的结果完全由最后一次循环的判断结果决定,你最后一次循环刚好触发else分支,因此整列都被填充为0。
修复方案
1. 保留循环写法适配多分支逻辑
如果需要保留if多分支的写法,只需要修改赋值语句,指定要赋值的行号即可:
# 先初始化新列,避免赋值时报错 data['column2'] = 0 # 遍历到倒数第二行即可,因为需要对比下一行的值 for i in range(len(data) - 1): a = data.loc[i, 'column1'] b = data.loc[i+1, 'column1'] if a == b: # 仅给当前第i行的column2赋值 data.loc[i, 'column2'] = 1 # 可以在这里继续加elif多分支判断 # elif xxx: # data.loc[i, 'column2'] = 2 else: data.loc[i, 'column2'] = 0 # 单独处理最后一行的取值(无下一行可对比,可按需求设置默认值) data.loc[len(data)-1, 'column2'] = 0
2. 更高效的向量化写法(推荐)
pandas原生向量化操作性能远高于循环,多分支逻辑可以用numpy.select实现:
import numpy as np # 按优先级写所有判断条件 conditions = [ # 等价于原逻辑的当前行和下一行column1相等 data['column1'] == data['column1'].shift(-1), # 可以继续添加其他多条件组合,示例: (data['column1'] > data['column1'].shift(-1)) & (data['column3'] > 20) ] # 每个条件对应的返回值,顺序和conditions一一对应 values = [1, 2] # default为所有条件都不满足时的默认填充值 data['column2'] = np.select(conditions, values, default=0)
内容的提问来源于stack exchange,提问作者Tworker
相关产品推荐
相关产品推荐

