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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:31:37