Pandas新增eligible条件列遇KeyError:False,求正确实现方案
解决Pandas新增eligible列的KeyError问题及优化方案
错误原因分析
你的代码出现KeyError: False是因为语法错误:lastYear_sale['Low_Balance_Flag'==0]这部分中,'Low_Balance_Flag'==0会先被计算为布尔值False,你实际上在尝试访问DataFrame中名为False的列,而该列不存在,导致报错。正确的写法应该是lastYear_sale['Low_Balance_Flag'] == 0,将条件放在列索引外部。
修正原始代码(仅适用于少量列)
即使修正语法,你的原始逻辑也只覆盖了部分情况(比如只考虑了两个列同时为0或同时为1的情况),无法正确处理“任意一个列为1则eligible为0”的需求。针对示例数据,修正后的代码如下:
import pandas as pd import numpy as np data = {'ID':['a', 'b', 'c', 'd'], 'Low_Balance_Flag':[1, 0, 1, 0], 'another_Flag':[0,0,1,1]} dfr = pd.DataFrame(data) # 修正语法后的条件:所有标记列都为0时eligible=1,否则为0 conditions = [(dfr['Low_Balance_Flag'] == 0) & (dfr['another_Flag'] == 0)] choices = [1] dfr['eligible'] = np.select(conditions, choices, default=0) print(dfr)
但这种写法对于20个标记列来说非常繁琐,需要逐一写所有列的==0并通过&连接,极易出错。
高效可扩展的解决方案
针对“任意一个标记列为1则eligible=0,全部为0则eligible=1”的需求,更简洁且可扩展的方法是利用行方向的聚合操作:
方法1:求和判断
标记列的和大于0意味着至少有一个列是1,此时eligible为0;和为0则所有列都是0,eligible为1:
# 定义所有标记列的列表(替换为你的20个列名) flag_columns = ['Low_Balance_Flag', 'another_Flag'] # 按行求和,判断是否为0,转换为整数(True→1,False→0) dfr['eligible'] = (dfr[flag_columns].sum(axis=1) == 0).astype(int)
方法2:全为0判断
直接检查所有标记列是否都为0,转换为整数:
dfr['eligible'] = (dfr[flag_columns] == 0).all(axis=1).astype(int)
示例输出
运行上述任意一种方法,得到的结果与你的期望一致:
ID Low_Balance_Flag another_Flag eligible 0 a 1 0 0 1 b 0 0 1 2 c 1 1 0 3 d 0 1 0
内容的提问来源于stack exchange,提问作者user13948
相关产品推荐
相关产品推荐

