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
相关产品推荐
相关产品推荐

