如何在DataFrame的同一分组内按指定概率随机删除行
Pandas 分组按概率随机删行实现方案
前置准备
如果还没构造测试数据可以用这段代码生成你给出的示例数据集,已有数据可直接跳过:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Team': ['Riders']*6 + ['Kings']*4 + ['Royals']*2, 'Rank': [1,2,2,3,3,4,1,1,2,4,1,2], 'Year': [2014,2015,2016,2017,2018,2019,2016,2017,2018,2019,2015,2017] })
实现方法
你可以根据自己的需求二选一:
方案1:每组严格保留50%比例的行
用groupby+sample直接按比例采样,适合要求每组行数严格接近一半的场景:
# 加random_state参数可以固定随机结果,方便复现,不需要可以删掉 result = df.groupby('Team', group_keys=False).apply(lambda x: x.sample(frac=0.5, random_state=42))
方案2:分组内每行独立以50%概率保留
每条记录单独判断是否删除,更符合“0.5概率随机删行”的原生需求,每组最终保留行数可能有波动:
# 提前设置随机种子可以固定结果,不需要可以删掉np.random.seed这行 np.random.seed(42) result = df[df.groupby('Team')['Team'].transform(lambda x: np.random.rand(len(x)) > 0.5)]
内容的提问来源于stack exchange,提问作者Ephraim gxy
相关产品推荐
相关产品推荐

