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

DataFrame列检测到0但转列表后消失,断言触发AssertionError原因

问题:DataFrame列判断存在0,转列表后却触发断言错误?

我写了这段代码:

if 0 in df[RATING_COL]:
    rating_col_list = df[RATING_COL].to_list()
    assert 0 in rating_col_list

结果断言触发了AssertionError。明明判断DataFrame的列里有0,转成列表后0却消失了?

我加载的是基于MovieLens-1M的数据集,格式如下:

user_id,item_id,rating
1,1193000,2
1,1193001,3
1,1193002,4
1,1193003,5
1,1193004,6
1,1193005,7
1,1193006,8
1,1193007,9
1,1193008,10
1,661000,6
1,661001,7
1,661002,8
1,661003,9
1,661004,10
1,661005,9
1,661006,8
1,661007,7
1,661008,6

注:数据中1,1193008,10表示用户1对物品1193的评分为8,10是评分值;同理1,661004,10表示用户1对物品661的评分为4。我已经用CTRL-F确认过,rating列里没有0评分。


解答

这是pandas Series和Python列表的in操作行为差异导致的:

  • 对df[RATING_COL](即pandas Series)使用0 in ...时,pandas实际检查的是Series的索引中是否存在0,而不是列的数值里有没有0。如果你的DataFrame用的是默认的从0开始的连续索引,这个判断就会返回True,哪怕列里根本没有0值。
  • 而0 in rating_col_list是检查列表的元素,你的数据里确实没有0,所以断言失败。

验证方式

打印Series的索引就能确认:

print(df[RATING_COL].index)
# 输出大概率是 RangeIndex(start=0, stop=xxx, step=1),包含0索引

正确的检查方式

要判断列值中是否存在0,应该用以下两种方式之一:

  1. 用布尔判断的any()方法:
if (df[RATING_COL] == 0).any():
    # 后续逻辑
  1. 检查Series的values属性:
if 0 in df[RATING_COL].values:
    # 后续逻辑

结合你的情况,因为数据里根本没有0评分,用正确的检查方式就不会进入这个分支,断言错误也不会出现。


内容的提问来源于stack exchange,提问作者Pro Q

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:37