如何随机抽取Pandas DataFrame的50%行并满足指定列比例要求?
解决方案
要实现这个带比例要求的分层随机抽样需求,你可以按以下步骤操作:
步骤1:明确抽样目标
- 原DataFrame共10行,50%的样本量为 5行
- 要求选中的行中,
C=True占90%、C=False占10%,结合原数据中C=False仅有3行的情况,我们取整为抽取4行C=True、1行C=False
步骤2:拆分数据子集
先按C的取值将原DataFrame拆分为两个独立子集:
# 拆分出C为True和False的子集 df_true = df[df["C"] == True] df_false = df[df["C"] == False]
步骤3:计算各子集抽样数量
# 计算总抽样行数 total_sample = int(len(df) * 0.5) # 计算C=True子集的抽样数(90%总样本量) sample_true = int(total_sample * 0.9) # 计算C=False子集的抽样数(剩余数量) sample_false = total_sample - sample_true # 额外校验:避免抽样数超过子集本身的行数 sample_true = min(sample_true, len(df_true)) sample_false = min(sample_false, len(df_false))
步骤4:抽样并合并结果
使用sample()方法完成随机抽样,最后合并并打乱结果顺序:
# 对两个子集分别随机抽样,random_state可选,用于固定抽样结果 sampled_true = df_true.sample(n=sample_true, random_state=42) sampled_false = df_false.sample(n=sample_false, random_state=42) # 合并抽样结果并打乱行顺序 final_sample = pd.concat([sampled_true, sampled_false]).sample(frac=1, random_state=42)
验证抽样结果
可以用以下代码确认结果是否符合要求:
print("最终样本行数:", len(final_sample)) print("C=True占比:", (final_sample["C"] == True).mean())
内容的提问来源于stack exchange,提问作者saraafr
相关产品推荐
相关产品推荐

