基于PySpark从大DataFrame生成与小DataFrame变量比例一致的2倍样本集
按指定比例从大DataFrame抽取匹配样本的解决方案
核心思路
要实现符合要求的抽样,关键是先确定每个variable类别的目标抽取量,再从大DataFramedf中按该数量精准抽取:
- 目标量计算:df1中每个
variable的记录数 × 2(因为样本规模是df1的2倍) - 抽样逻辑:对每个
variable类别,从df的对应子集中抽取指定数量的样本,确保类别占比与df1完全一致
代码实现
import pandas as pd # 计算每个variable需要抽取的样本数(df1对应数量的2倍) target_sample_counts = df1['variable'].value_counts() * 2 # 逐个抽取每个类别的样本并收集 collected_samples = [] for var_name, required_count in target_sample_counts.items(): # 筛选df中当前variable的所有记录 var_records = df[df['variable'] == var_name] # 检查可用记录是否满足需求,避免报错 if len(var_records) < required_count: print(f"注意:variable '{var_name}' 在df中仅存在 {len(var_records)} 条记录,无法满足抽取 {required_count} 条的要求,将抽取全部可用记录") collected_samples.append(var_records) else: # 抽取指定数量样本,random_state保证结果可复现 sampled_records = var_records.sample(n=required_count, random_state=42) collected_samples.append(sampled_records) # 合并所有样本得到最终数据集 final_sample_df = pd.concat(collected_samples, ignore_index=True)
验证方法
执行完抽样后,可以通过以下代码验证结果是否符合要求:
# 检查样本总规模是否为df1的2倍 print(f"样本总规模:{len(final_sample_df)},df1规模的2倍:{len(df1)*2}") # 检查各variable的占比是否与df1一致 print("\n样本中各variable占比:") print(final_sample_df['variable'].value_counts(normalize=True)) print("\ndf1中各variable占比:") print(df1['variable'].value_counts(normalize=True))
内容的提问来源于stack exchange,提问作者Harish reddy
相关产品推荐
相关产品推荐

