如何从不平衡DataFrame中采样得到列值平衡的指定大小样本?
不平衡DataFrame的平衡抽样方案
针对你的需求——从100k条记录的不平衡DataFrame中抽取10k条平衡样本(claimed列1和2各5k条),可以用以下两种简洁的pandas实现方式:
方法一:分组抽样(推荐)
通过groupby结合sample,一次性完成分组抽取与合并:
import pandas as pd # 设定每组需抽取的样本量(10k平衡样本,每组5000条) per_group_size = 5000 # 按claimed分组,每组抽取指定数量样本,合并为平衡DataFrame balanced_df = df.groupby('claimed', group_keys=False).apply( lambda group: group.sample(n=per_group_size, random_state=42) )
group_keys=False避免将分组列作为索引的一部分,保持原DataFrame结构random_state用于固定随机种子,确保抽样结果可复现,可按需移除
方法二:分步抽取(更直观)
先分别筛选两类数据,各自抽样后再合并打乱:
# 从claimed=1的样本中抽取5000条 sample_1 = df[df['claimed'] == 1].sample(n=5000, random_state=42) # 从claimed=2的样本中抽取5000条 sample_2 = df[df['claimed'] == 2].sample(n=5000, random_state=42) # 合并样本集并打乱顺序(避免数据按类别集中) balanced_df = pd.concat([sample_1, sample_2]).sample(frac=1, random_state=42)
- 最后一步的
sample(frac=1)用于打乱合并后的数据,让两类样本随机分布
注意事项
如果某类样本数量不足所需抽取量(比如假设claimed=2只有4000条),可在sample中添加replace=True启用有放回抽样,但你的场景中claimed=2有20k条,完全满足无放回抽取5000条的需求,无需设置。
内容的提问来源于stack exchange,提问作者Patthebug
相关产品推荐
相关产品推荐

