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

Pandas按条件更新列值出错求助:所有Score值被改为0求错因

问题分析与修复:DataFrame Score列全变为0的原因及解决办法

问题场景

你想要按照以下规则更新DataFrame的Score列:

  • 当Score>3时,设为1
  • 当Score<=2时,设为0
  • 当Score==3时,删除该行

但运行你写的代码后,所有Score值都变成了0,你的代码如下:

reviews.loc[reviews['Score'] > 3, 'Score'] = 1
reviews.loc[reviews['Score'] <= 2, 'Score'] = 0
reviews.drop(reviews[reviews['Score'] == 3].index, inplace = True)

错误原因

问题出在代码执行顺序!
当你执行第一行代码,把Score>3的行设为1之后,这些行的Score值变成了1——而1是满足Score<=2这个条件的!所以在执行第二行代码时,这些刚被设为1的行又被覆盖成0了。最后,原本Score>3的行全变成0,Score<=2的行也变成0,Score==3的行被删除,自然剩下的所有Score都是0。

修复方案

我们只需要调整执行顺序,先删除Score==3的行,再处理剩下的Score值,就能避免覆盖问题:

方案一:分步调整顺序

# 第一步:先删除Score等于3的行,避免后续干扰
reviews.drop(reviews[reviews['Score'] == 3].index, inplace=True)
# 第二步:处理Score>3的情况(此时剩下的Score只有1、2、4、5)
reviews.loc[reviews['Score'] > 3, 'Score'] = 1
# 第三步:处理Score<=2的情况
reviews.loc[reviews['Score'] <= 2, 'Score'] = 0

方案二:用numpy.where简化代码

如果想要更简洁的写法,可以用numpy.where一次性完成赋值,同时先过滤掉Score==3的行:

import numpy as np

# 先过滤掉Score为3的行
reviews = reviews[reviews['Score'] != 3]
# 用where函数根据条件直接赋值
reviews['Score'] = np.where(reviews['Score'] > 3, 1, 0)

这样执行后,就能完美符合你的需求了:Score>3的行变为1,Score<=2的行变为0,Score==3的行被彻底移除。

内容的提问来源于stack exchange,提问作者Satyam Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:12:35