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

如何解决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,提问作者максим ильин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:37:44