基于值频率的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,结果会因抽样随机性略有差异)
逻辑说明
- 定义
dynamic_sample函数,接收每个分组数据后先获取分组行数 - 按规则匹配对应抽样比例:
- 行数小于8:抽取50%
- 行数在8到12之间:抽取40%
- 行数大于12:抽取30%
- 对每个分组应用抽样逻辑,最后重置索引得到最终抽样数据
内容的提问来源于stack exchange,提问作者armin
相关产品推荐
相关产品推荐

