pandas分组抽样replace=False样本量不足时如何获取全部现有样本
实现方法
可以通过自定义分组抽样逻辑实现,核心是对每个分组动态判断抽样数量,行数≥30时抽30行,不足30时随机返回全部分组行,不会触发报错也无需有放回抽样。
简洁版写法(pandas全版本支持)
df = df.groupby('ID', group_keys=False).apply( lambda x: x.sample(n=min(len(x), 30)) ).reset_index(drop=True)
自定义函数写法(适合需要附加额外处理逻辑的场景)
def group_sample(group, sample_n=30): # 分组行数大于等于抽样数时抽sample_n行,否则随机返回全组 if len(group) >= sample_n: return group.sample(n=sample_n) else: return group.sample(frac=1) df = df.groupby('ID', group_keys=False).apply(group_sample).reset_index(drop=True)
逻辑说明
- 对每个ID分组,先取分组行数和30的较小值作为实际抽样数,避免抽样数大于样本量的报错
- 不足30行的分组会返回全组随机打乱后的结果,既满足无放回要求,也避免了
head(30)只能取前N行的非随机问题 - 代码中的
group_keys=False用于避免分组后产生额外的ID索引层级,reset_index(drop=True)用于重置整体索引,不需要保留原始索引可删除这两个参数。
内容的提问来源于stack exchange,提问作者ga1996
相关产品推荐
相关产品推荐

