嵌套numpy.where实现DataFrame列输出Pass/Fail/P值的报错解决
问题根因
触发ValueError: No axis named 1 for object type Series的核心原因:criteria_1_mapped是逐行计算生成的一维Series结构,本身只有0号轴,不存在1号轴。你对这个一维结果调用.any(axis=1)做聚合时,pandas找不到指定的1号轴,直接抛出错误。
本质上这行判断完全多余:(criteria_1_mapped == "P")本身已经是逐行标记的布尔Series,直接可以用来做条件判断,根本不需要额外做.any()的全表聚合——你要的是逐行判定当前行是否含P,不是判断全表有没有P。
可行实现方案
方案1:单步映射完成全规则判定(最简无冗余)
完全去掉中间临时变量和嵌套np.where的逻辑,直接把全部判定规则写进逐行映射的lambda里,代码更短也没有轴操作的坑:
# 逐行拼接c1-c4,直接输出对应判定结果 df["criteria 1"] = (df['c1'] + df['c2'] + df['c3'] + df['c4']).map( lambda x: # 规则1:拼接字符串含P直接返回P "P" if "P" in x # 规则2:全为1时返回Fail else "Fail" if sum(map(int, list(x))) == 4 # 规则3:其余情况返回Pass else "Pass" )
- 相比原实现,少了两次临时变量赋值、两次类型转换,运行效率更高,也不会出现轴匹配错误。
方案2:保留原代码结构的修正版本
如果你习惯原有代码的拆分逻辑,只需要删掉触发报错的多余聚合代码即可:
# 原逻辑保留:逐行拼接生成字符串 criteria_1 = df['c1'] + df['c2'] + df['c3'] + df['c4'] # 原逻辑保留:逐行映射出"P"或数值求和结果 criteria_1_mapped = criteria_1.map(lambda x: 'P' if 'P' in x else sum(map(int, list(x)))) # 修正:删除多余的.any(axis=1),直接用逐行布尔结果做判断 is_P_row = (criteria_1_mapped == "P") # 嵌套np.where逻辑不变 df["criteria 1"] = np.where( is_P_row, "P", np.where(criteria_1_mapped == 4, "Fail", "Pass") )
注意:你原代码里的列名存在引号未闭合的笔误(例如
df['c1]),运行前需要把所有列名的引号补全,否则会触发语法错误。
内容的提问来源于stack exchange,提问作者kitchen800
相关产品推荐
相关产品推荐

