如何解决Python中unsupported operand type(s)错误及DataFrame条件筛选时的NaN判断问题
解决Pandas筛选时的NaN判断错误问题
首先帮你理清问题核心:你说的没错,shift(-1)会让DataFrame最后一行的对应位置变成NaN,而NaN和整数做比较运算时就会抛出unsupported operand type(s)错误。另外还得提一句,你代码里有个小笔误——df['ends']应该是df1['ends']哦。
下面给你两种实用的解决方案:
方案1:直接排除最后一行的检查
既然最后一行一定会产生NaN,那我们可以提前把它从筛选范围里剔除,这样就不会触发错误了。这里有两种写法:
- 简单链式索引写法(注意可能触发SettingWithCopyWarning):
filtered_df = df1.iloc[:-1][(df1['starts'] < df1['ends']) & (df1['starts'].shift(-1) >= df1['ends'])]
- 更稳妥的掩码写法(避免警告):
# 构建掩码:满足原条件 + 不是最后一行 mask = (df1['starts'] < df1['ends']) & (df1['starts'].shift(-1) >= df1['ends']) & (~df1.index.isin([df1.index[-1]])) filtered_df = df1[mask]
方案2:处理NaN值,让最后一行自动不满足条件
如果你不想直接排除最后一行,而是希望它在筛选时自动被过滤掉,可以用fillna()把NaN替换成一个永远不满足>= df1['ends']的数值,比如-1:
mask = (df1['starts'] < df1['ends']) & (df1['starts'].shift(-1).fillna(-1) >= df1['ends']) filtered_df = df1[mask]
这样最后一行的starts.shift(-1)会被替换成-1,和该行的ends(46)比较时,-1 >= 46不成立,自然不会被选中,完美避开NaN的类型问题。
另外还要提醒你:Pandas里&运算符的优先级比<、>=高,所以一定要给每个单独的条件加上括号,否则会出现逻辑错误,上面的写法已经帮你修正了这个细节。
内容的提问来源于stack exchange,提问作者максим ильин
相关产品推荐
相关产品推荐

