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

基于值频率的DataFrame多条件随机抽样实现

按分组频率动态抽样的正确实现

你的问题出在原代码使用了固定的0.2抽样比例,没有根据每个分组的实际计数动态调整抽样比例。以下是符合需求的实现方案:

方法:通过分组大小动态设置抽样比例

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame(np.random.choice(list(['a', 'b', 'c', 'd']), 50), columns=list('1'))

def dynamic_sample(group):
    # 获取当前分组的行数
    group_size = group.shape[0]
    # 根据分组大小匹配抽样比例
    if group_size < 8:
        sample_frac = 0.5
    elif 8 <= group_size <= 12:
        sample_frac = 0.4
    else:
        sample_frac = 0.3
    # 执行抽样,设置random_state保证结果可复现
    return group.sample(frac=sample_frac, random_state=0)

# 分组应用动态抽样逻辑
sample_df = df.groupby('1').apply(dynamic_sample).reset_index(drop=True)

# 查看抽样结果
print(sample_df.value_counts())

运行结果示例

1
d    5
a    5
b    5
c    3
dtype: int64

(注:若不设置random_state,结果会因抽样随机性略有差异)

逻辑说明

  1. 定义dynamic_sample函数,接收每个分组数据后先获取分组行数
  2. 按规则匹配对应抽样比例:
    • 行数小于8:抽取50%
    • 行数在8到12之间:抽取40%
    • 行数大于12:抽取30%
  3. 对每个分组应用抽样逻辑,最后重置索引得到最终抽样数据

内容的提问来源于stack exchange,提问作者armin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:48