Python报错:bad operand type for unary ~: 'NoneType' 求解决方案
解决
bad operand type for unary ~: 'NoneType'错误 这个错误我之前处理过,核心问题是~(取反运算符)被作用在了NoneType类型的值上,本质是你的df.var2.str.contains()返回的结果里存在无法被取反的非布尔值(通常是NaN),而NaN在布尔运算场景下会被识别为类似None的类型,从而触发报错。
为什么会出现这个问题?
当你的var2列存在以下情况时,str.contains()会返回NaN而不是预期的布尔值(True/False):
- 列中有缺失值(NaN)
- 列中包含非字符串类型的元素(比如数字、None)
当你尝试用~对包含NaN的Series取反时,就会抛出这个类型错误。
修复方案
按照以下步骤修改你的代码:
确保
var2列是字符串类型
先把var2列强制转换为字符串,这样即使有缺失值也会被转为字符串'NaN',避免非字符串元素导致str.contains()返回NaN:df['var2'] = df['var2'].astype(str)填充
str.contains()的缺失值
对str.contains()的结果用fillna(False)填充,把NaN替换为False(逻辑上我们可以认为缺失值不匹配目标字符串),再进行取反操作:import numpy as np import pandas as pd # 先处理var2类型 df['var2'] = df['var2'].astype(str) # 修改后的np.where逻辑 df['new_FLAG'] = np.where( ~(df.var2.str.contains('Test|Random|Hypo|Sample', case=False).fillna(False)) & df.var3.isin(['CLIENT_CURRENT', 'MODEL_CURRENT', 'HYPOTHETICAL']) & (df.var1 > 4) & (df.var1 < 31), 'Y', 'N' )
额外排查技巧
你可以先单独运行以下代码,查看str.contains()的结果是否包含NaN:
print(df.var2.str.contains('Test|Random|Hypo|Sample', case=False))
如果输出里有NaN值,就完全验证了我们的问题分析。
内容的提问来源于stack exchange,提问作者Chrissie M.
相关产品推荐
相关产品推荐

