基于统计结果按4:1年龄性别匹配创建DataFrame子集的技术问询
实现年龄/性别匹配子集的方法
步骤1:打乱数据集并添加组内序号
先对完整数据集full_df做随机打乱,再给每个(年龄,性别)组添加从1开始的连续序号:
import pandas as pd # 随机打乱full_df,random_state用于固定随机结果(可选) shuffled_full = full_df.sample(frac=1, random_state=42) # 按age和gender分组,为每组生成1到组长度的order序号 shuffled_full['order'] = shuffled_full.groupby(['age', 'gender']).cumcount() + 1
步骤2:生成4:1匹配的子集
基于df1的统计结果,计算每个组需要抽取的样本量(原数量的4倍),再从打乱后的数据集里抽取对应样本:
# 先给df1新增列,计算每组需要抽取的样本数 df1['sample_size'] = df1['n'] * 4 # 定义分组抽样的函数 def get_matched_samples(group): # 获取当前组对应的目标抽样数量 age, gender = group.name target_num = df1[(df1['age'] == age) & (df1['gender'] == gender)]['sample_size'].iloc[0] # 抽取目标数量的样本(如果组内人数不足则取全部) return group.head(target_num) # 按age和gender分组执行抽样,最后重置索引 matched_subset = shuffled_full.groupby(['age', 'gender']).apply(get_matched_samples).reset_index(drop=True)
说明
- 打乱数据集时用
sample(frac=1)实现全量随机重排,random_state参数可以固定随机结果,方便后续调试和复现。 cumcount()+1会为每个(age,gender)组内的行生成从1开始的连续序号,完全符合示例中的order格式要求。- 抽样时直接取组内前N行(N为目标数量),因为数据集已经提前打乱,所以前N行等价于随机抽取的样本。如果某个组在
full_df中的总人数不足目标数量,会自动取该组全部数据,避免报错。
内容的提问来源于stack exchange,提问作者Shahin
相关产品推荐
相关产品推荐

