Pandas如何实现多组无重叠随机抽样 组内及样本间均无重复行
Pandas 无重叠多组随机抽样实现方案
核心思路是先一次性抽取所有需要的总样本量,再拆分到各组,从根源上避免组间重叠问题,不需要对全量数据做批量分组标记。
你之前使用的df.sample(300, replace=False)仅在单次抽样范围内做无放回抽取,每次抽样的基数都是全量原数据,自然无法避免跨组抽到同一行的问题。
实现代码
总抽样量为4组*300行=1200行,远小于原数据5000行的基数,抽样逻辑完全成立:
import pandas as pd # 配置抽样参数 group_num = 4 per_group_size = 300 total_sample_size = group_num * per_group_size # 第一步:一次性从原数据无放回抽取全部所需样本,全局无重复 # 不需要结果复现可以删掉random_state参数 all_selected = df.sample(n=total_sample_size, replace=False, random_state=123) # 第二步:按顺序切分为指定数量的样本组 sample_groups = [] for i in range(group_num): group = all_selected.iloc[i*per_group_size : (i+1)*per_group_size].reset_index(drop=True) sample_groups.append(group) # 调用方式:sample_groups[0]为第一组样本、sample_groups[1]为第二组,以此类推
合规性校验
你可以运行以下代码验证抽样结果是否符合要求:
# 校验组内无重复 for idx, group in enumerate(sample_groups): dup_rows = group.duplicated().sum() print(f"第{idx+1}组重复行数:{dup_rows}") # 输出0即符合要求 # 校验组间无重叠 from itertools import combinations for g1, g2 in combinations(sample_groups, 2): overlap_rows = len(set(g1.index) & set(g2.index)) print(f"跨组重叠行数:{overlap_rows}") # 输出0即符合要求
注意:如果你的原始DataFrame本身就存在内容完全一致的重复行,需要先执行
df = df.drop_duplicates()去重后再抽样,否则无放回抽样也可能抽到内容重复的行。
内容的提问来源于stack exchange,提问作者user19413311
相关产品推荐
相关产品推荐

