带限制的加权抽样:排除样本个体但纳入权重计算是否可行?
加权抽样方案可行性及代码优化
结论:完全可行
你要的这种抽样逻辑是成立的——权重计算用包含所有个体(包括那些不能进样本的特定个体)的完整总体,抽样只从剔除特定个体后的池子里按权重抽。这样既保证了权重能反映真实的总体结构,又避开了不想纳入样本的个体,完全符合你的需求。
针对你现有代码的调整建议
你的原代码里权重计算和抽样都绑定了Concat !=0的筛选,现在需要把这两步拆分开:权重基于全总体算,抽样只从允许的个体里抽。修改后的代码如下:
import numpy as np import pandas as pd def get_weighted_sample(df, n): # 1. 用完整总体(含所有个体)算各Product的抽样量 total_pop = len(df) # 按Product分组算占比,再乘目标样本量n得到每组要抽的数量 group_sample_counts = (df.groupby('Product').size() / total_pop * n).round().astype(int) # 2. 从每组里的允许抽样个体(Concat != 0)中抽取对应数量的样本 def pick_sample_from_group(group_df): product_name = group_df.name needed = group_sample_counts.get(product_name, 0) eligible = group_df[group_df.Concat != 0] # 防止组内符合条件的个体不够抽的情况,直接取全部 if len(eligible) < needed: return eligible.reset_index(drop=True) return eligible.sample(needed).reset_index(drop=True) weighted_sample = df.groupby('Product').apply(pick_sample_from_group) print(weighted_sample["Product"].value_counts()) return weighted_sample # 调用示例 sample = get_weighted_sample(df, 10) sample
调整的核心逻辑
- 权重计算阶段:不再过滤
Concat=0的个体,用整个数据集的规模来算各组占比,确保那些被排除的个体能影响权重结构 - 抽样执行阶段:只从
Concat !=0的个体里抽,保证样本里没有特定个体 - 加了容错处理:如果某组里符合条件的个体不够抽,直接取全部,避免报错
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

