Pandas编写条件筛选语句时出现KeyError: False报错该如何解决?
问题原因拆解
- 初始KeyError报错原因:你直接对字符串
'DeliveryOnTime'做等值判断,而非取DataFrame的DeliveryOnTime列做判断,'DeliveryOnTime' == "On-time"的结果是固定布尔值False,用布尔值作为列索引取数自然触发KeyError。 - np.where写法无效原因:你设置的条件成立和不成立的返回值都是
1,不管判断结果如何所有行都会赋值为1,没有实现区分效果。 - .loc写法无效原因:第一你用了逻辑与
&要求字段同时等于两个互斥的值,筛选结果为空;第二你对筛选结果做了sum()聚合,返回的是单个数值,会给整列统一赋值为这个数,不是逐行判断的结果。
正确实现方式
以下实现均默认符合条件(值为On-time/Early)时Eligible赋值为1,不符合时赋值为0,你可以根据业务需求调整返回值。
方法1:np.where 实现
import pandas as pd import numpy as np # 你的样本数据 data = {'ID': [1, 1, 1, 2, 2, 3, 4, 5, 5], 'DeliveryOnTime': ["On-time", "Late", "Early", "On-time", "On-time", "Late", "Early", "Early", "On-time"], } df = pd.DataFrame(data) df['Total Orders'] = df['DeliveryOnTime'].count() # 实现赋值 df['Eligible'] = np.where((df['DeliveryOnTime'] == "On-time") | (df['DeliveryOnTime'] == "Early"), 1, 0)
可以用isin简化多值判断逻辑:
df['Eligible'] = np.where(df['DeliveryOnTime'].isin(["On-time", "Early"]), 1, 0)
方法2:.loc 实现
# 先给所有行赋默认值0 df['Eligible'] = 0 # 再给符合条件的行赋值1 df.loc[df['DeliveryOnTime'].isin(["On-time", "Early"]), 'Eligible'] = 1
方法3:布尔值转整数(仅适用于0/1标识场景)
如果只需要用0/1标记是否符合条件,可以直接对布尔结果做类型转换,逻辑更简洁:
df['Eligible'] = df['DeliveryOnTime'].isin(["On-time", "Early"]).astype('int')
内容的提问来源于stack exchange,提问作者cchev
相关产品推荐
相关产品推荐

