如何在Pandas中按组等概率随机采样(非固定每组行数)

本文介绍一种灵活的pandas分组采样策略:不强制每组抽取相同行数,而是使每个分组被选中的总体概率近似相等,适用于组大小差异大、且需保持组间采样公平性的场景。

本文介绍一种灵活的pandas分组采样策略:不强制每组抽取相同行数,而是使每个分组被选中的总体概率近似相等,适用于组大小差异大、且需保持组间采样公平性的场景。

在实际数据分析中,我们常需对分组数据进行随机采样。但 df.groupby("ID").sample(n=k) 会严格要求每组恰好抽取 k 行,当各组样本量差异显著时,可能导致小组合被过度代表、大组合代表性不足——这违背了“组间采样概率均等”的初衷。

要实现每组被选中的概率大致相同(即:任意一行属于某组 ID,其最终被采中的概率 ≈ 1 / 组总数),推荐采用两阶段采样法:

  1. 第一阶段:按组均匀过采样
    先对每个组独立采样 ⌈N / G⌉ 行(G 为唯一组数),允许重复(replace=True),确保各组提供足够候选;
  2. 第二阶段:全局随机抽样
    从所有候选行中无放回地随机抽取 N 行,使最终结果中各组出现频次趋于均衡。
import pandas as pd
import math

# 示例数据
df = pd.DataFrame({
    'ID': ['a', 'a', 'b', 'c', 'c', 'c'],
    'Value': [2, 4, 6, 8, 10, 12]
})

N = 4  # 目标总采样行数
G = df['ID'].nunique()  # 组总数

# 两阶段等概率采样
result = (df.groupby('ID')
          .sample(n=math.ceil(N / G), replace=True)
          .sample(N, replace=False)  # replace=False 更符合常规需求;若需支持 N > 总候选数,可设 replace=True
          .reset_index(drop=True))

print(result)

关键优势

Img.Upscaler

免费的AI图片放大工具

  • 不依赖各组原始大小,小组合不会因样本少而被忽略;
  • 随着 N 增大,各组在结果中的占比快速收敛至 1/G(如 N=100 时三组占比均接近 33%);
  • 计算高效,仅两次 sample() 调用,无显式循环或自定义函数。

⚠️ 注意事项

  • 若 N 极小(如 N < G),math.ceil(N/G) 可能为 1,此时第一阶段采样量充足,第二阶段仍能保证随机性;
  • 默认使用 replace=False 在第二阶段,避免单一样本被多次选取(除非业务明确需要);
  • 如需复现结果,请在两步 sample() 中均设置 random_state(例如 .sample(..., random_state=42))。

该方法平衡了统计公平性与工程简洁性,是处理不平衡分组采样的实用范式。

相关推荐:

LightGBM在Python下为什么比XGBoost快_基于直方图算法与单边梯度采样

LightGBM比XGBoost快的核心原因是直方图特征离散化和GOSS采样:前者将连续特征映射为整数桶,降低排序与增益计算复杂度;后者保留高梯度样本并加权采样低梯度样本,减少数据遍历量。 LightGBM在Python下比XGBoost快,核心原因不是“代码写得更精简”,而是算法层面的两个关键设计...

如何在不支持重触发的NI USB-6002设备上实现高密度外部触发AI采样

本文介绍一种绕过niusb-6002硬件限制的实用方案:通过双通道同步模拟采集(ai0+ai1)记录触发信号与目标信号,再结合离线边缘检测精准截取每触发对应的2–5个采样点,成功支持最小1ms间隔的非均匀外部触发采集。 本文介绍一种绕过niusb-6002硬件限制的实用方案:通过双通道同步模拟采集(...

Python类中正确实现列表随机打乱的实践指南

在Python类初始化时直接对传入列表调用random.shuffle()会导致多个实例共享同一份被修改的数据,根本原因是未创建独立副本;解决方法是使用.copy()或list()构造新列表后再打乱。 在python类初始化时直接对传入列表调用`random.shuffle()`会导致多个实例共享同...

Python中如何处理数据倾斜严重的分类任务_使用SMOTE算法过采样

SMOTE不是万能开关,用错位置、时机或参数会降低模型性能;根本原因是未标准化导致量纲主导邻域搜索、数据泄露造成验证失真、k值不当生成噪声样本,以及误用sklearn而非imblearn库。 SMOTE不是“一加就灵”的开关,用错位置、用错时机、用错参数,反而会让模型在测试集上F1下降、precis...