为何np.random.choice会误删数据集不该删除的行?
问题排查:误删非目标类别数据的原因分析
问题背景
处理名为gen的数据集,churn?列是0/1的二元整数类型,初始统计:
- 值0:1125行
- 值1:154行
为平衡数据集,尝试随机删除200行值为0的数据,代码如下:
# 筛选churn?为0的行,随机选取200行索引 rows_to_remove = np.random.choice(gen[gen['churn?']==0].index, size=200, replace=False) # 删除选中的行得到新数据集 gen_new = gen.drop(rows_to_remove)
执行后结果异常:
- 值0的行正确剩余925行
- 值1的行仅剩130行,莫名丢失24行
可能的原因及排查方案
索引重复导致误删:如果数据集的索引不是唯一值,
drop方法会删除所有匹配该索引的行。比如某条值为1的行和被选中的0值行索引相同,执行删除时会被一并删掉。
排查:运行gen.index.is_unique,返回False就说明存在重复索引。解决:先重置索引gen = gen.reset_index(drop=True),再执行删除逻辑。筛选逻辑或变量污染:检查是否有其他代码修改了
gen或rows_to_remove。比如生成rows_to_remove后,立刻执行gen.loc[rows_to_remove, 'churn?'].value_counts(),确认选中的全是0值行。如果这里出现1,可能是churn?列数据类型不对(比如是字符串'0'而非整数0,导致筛选条件不匹配),或者列名写错了。数据集实际行数不符:确认
len(gen[gen['churn?']==0])确实是1125,避免筛选条件写错导致选中了部分1值行的索引。旧版本Pandas的bug:极少数旧版Pandas(低于1.0)处理非唯一索引的
drop时可能有异常,运行pd.__version__检查版本,必要时升级重试。
内容的提问来源于stack exchange,提问作者tessema_t
相关产品推荐
相关产品推荐

