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

Python如何从dataframe抽取性别各半、年龄中位数为40的随机样本

实现方案

首先需确认两个前提:

  • 样本容量n需为偶数,才能保证男女占比严格各50%
  • 原始数据集需有足够的单性别样本,且年龄分布支持提取中位数为40的子集,否则抽样会失败

完整代码实现

import pandas as pd
import numpy as np

# 自定义抽样容量,按实际需求修改
n = 200
k = n // 2
target_median = 40
# 最多迭代次数,避免数据不满足要求时死循环
max_iter = 1000

# 1. 按性别拆分数据集,此处gender的取值根据你的实际字段值调整,比如'男'/'女'
male_df = df[df['gender'] == 'M'].reset_index(drop=True)
female_df = df[df['gender'] == 'F'].reset_index(drop=True)

# 校验单性别样本量是否足够
if len(male_df) < k or len(female_df) < k:
    raise ValueError("单性别样本量不足,无法满足男女各占50%的抽样要求")

# 2. 初始抽样:男女各抽k个
sample_male = male_df.sample(k, random_state=42) # 移除random_state可实现每次抽样结果随机
sample_female = female_df.sample(k, random_state=42)
final_sample = pd.concat([sample_male, sample_female], ignore_index=True)

# 3. 迭代调整样本直到年龄中位数符合要求
iter_count = 0
while final_sample['age'].median() != target_median and iter_count < max_iter:
    # 随机替换一个男性样本
    replace_m_idx = np.random.choice(sample_male.index)
    new_m = male_df[~male_df['subject_id'].isin(sample_male['subject_id'])].sample(1)
    sample_male.loc[replace_m_idx] = new_m.iloc[0]
    
    # 随机替换一个女性样本
    replace_f_idx = np.random.choice(sample_female.index)
    new_f = female_df[~female_df['subject_id'].isin(sample_female['subject_id'])].sample(1)
    sample_female.loc[replace_f_idx] = new_f.iloc[0]
    
    final_sample = pd.concat([sample_male, sample_female], ignore_index=True)
    iter_count += 1

if iter_count == max_iter:
    raise RuntimeError("迭代次数达上限,无法找到符合要求的样本,请检查原始数据年龄分布是否合理")

# 输出校验结果
print("抽样完成,校验结果:")
print(f"性别占比:\n{final_sample['gender'].value_counts(normalize=True)}")
print(f"年龄中位数:{final_sample['age'].median()}")

注意事项

  • 若你的gender字段取值不是M/F,需对应修改第一步的性别筛选条件
  • 如果原始数据中40岁附近的样本充足,通常迭代几次就能得到符合要求的样本
  • 若频繁触发迭代上限错误,可先查看原始数据的年龄分布,确认是否存在足够多40岁上下的样本支撑中位数要求

内容的提问来源于stack exchange,提问作者Dominic I.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:07