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

基于统计结果按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:25:15