Pandas如何标记DataFrame列存在非允许值?排查判断逻辑错误
问题出在哪
你的判断逻辑写反了,本质是没搞对.any()的作用:
df["type"].isin(["A","B","a","b"])会逐行返回布尔结果:当前行type是A/B的大小写形式就返回True,是非法值就返回False.any()的规则是:只要这串布尔结果里有一个True,整体就返回True——说白了就是只要表里有至少一个合法值,这一步就返回True- 你在前面加
~取反之后,整个if的触发条件变成了「表里连一个合法值都没有的时候才报警」,和你要的「有非法值就报警」完全不是一回事。
就拿你给的示例表来说,type列有A、B两个合法值,isin的结果是[True, True, False],.any()返回True,取反后是False,当然不会走警告分支,哪怕第三行是非法的C,也会直接打印校验通过。
正确写法
不用手动列全a、b这些大小写变体,直接把列值统一转成大写再判断就行,省事还不容易漏:
# 逻辑:不是所有值都合法的时候,打印警告 if not df["type"].str.upper().isin(["A", "B"]).all(): print("WARNING - Not all offers are the correct types!") else: print("OK - All offers are the correct types.")
要是觉得上面的写法绕,也可以直接判断有没有非法值,逻辑更直白:
# 先标记所有非法值,只要存在至少一个非法值就报警 illegal_exist = (~df["type"].str.upper().isin(["A", "B"])).any() if illegal_exist: print("WARNING - Not all offers are the correct types!") else: print("OK - All offers are the correct types.")
内容的提问来源于stack exchange,提问作者SRJCoding
相关产品推荐
相关产品推荐

