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,应该用以下两种方式之一:
- 用布尔判断的
any()方法:
if (df[RATING_COL] == 0).any(): # 后续逻辑
- 检查Series的
values属性:
if 0 in df[RATING_COL].values: # 后续逻辑
结合你的情况,因为数据里根本没有0评分,用正确的检查方式就不会进入这个分支,断言错误也不会出现。
内容的提问来源于stack exchange,提问作者Pro Q
相关产品推荐
相关产品推荐

