使用Pandas的sample和drop拆分数据集未达预期,求原因
问题原因分析与解决办法
核心原因:数据集索引存在重复值
你的代码逻辑本身没问题,但train_df的索引不是唯一的。当调用drop(index=I1.index)时,Pandas会删除所有索引匹配I1中索引值的行,而不是只删除I1选取的那2000行。如果原始数据里有大量重复索引,就会出现删除后剩余行数远少于预期的情况。验证方法
执行以下代码检查索引唯一性:print(train_df.index.is_unique) # 输出False说明存在重复索引 print(train_df.index.duplicated().sum()) # 查看重复索引的总数量解决办法
有两种常用方案:- 重置索引后再拆分
train_df = train_df.reset_index(drop=True) I1 = train_df.sample(frac=0.5, random_state=opts.seed) I2 = train_df.drop(index=I1.index) - 用布尔掩码拆分
先生成随机掩码,彻底避开索引重复的影响:import numpy as np mask = np.random.RandomState(opts.seed).choice([True, False], size=len(train_df), p=[0.5, 0.5]) I1 = train_df[mask] I2 = train_df[~mask]
- 重置索引后再拆分
内容的提问来源于stack exchange,提问作者Dr. Prof. Patrick
相关产品推荐
相关产品推荐

