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

带限制的加权抽样:排除样本个体但纳入权重计算是否可行?

加权抽样方案可行性及代码优化

结论:完全可行

你要的这种抽样逻辑是成立的——权重计算用包含所有个体(包括那些不能进样本的特定个体)的完整总体,抽样只从剔除特定个体后的池子里按权重抽。这样既保证了权重能反映真实的总体结构,又避开了不想纳入样本的个体,完全符合你的需求。

针对你现有代码的调整建议

你的原代码里权重计算和抽样都绑定了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:25:18