You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 03:06:02