如何在pandas中循环抽样DataFrame直至满足指定列均值条件
原有循环代码的问题
你写的循环无法正常达到目的,存在以下明确问题:
- 循环判定逻辑无效:
while df['score'].mean() > 0是对原始全量数据的score列求均值,这个值是固定的,和每次抽样的结果没有关联,只要原始数据均值大于0,循环就会一直运行,完全起不到控制流程的作用。 - 判断条件错误:一是抽样得到的均值是浮点数,你和字符串
'1.699'做等值比较永远不可能成立;二是浮点数计算存在精度误差,直接用==判断是否等于目标值本身就不符合数值计算逻辑,应该设置合理的容差范围。 - 语法错误:if语句末尾缺少Python语法要求的冒号,运行会直接报错。
- 存在冗余计算:权重映射、给全量df生成weightsScore列的操作只需要执行一次,不需要放在循环里重复计算。
单条件匹配修正代码
提前一次性计算好权重列,设置可接受的误差范围(比如和目标值相差不超过0.001即视为符合要求,可根据自己的精度需求调整),循环仅执行抽样和条件校验:
# 提前计算权重列,无需重复生成 weights = {0: 0.11, 1: 1.5} df['weightsScore'] = df['score'].apply(lambda x: weights[x]) target_mean = 1.699 tolerance = 0.001 # 可接受的均值误差 final_sample = None while True: current_sample = df.sample(n=533, weights='weightsScore') current_score_mean = current_sample['score'].mean() if abs(current_score_mean - target_mean) <= tolerance: final_sample = current_sample break # 输出样本统计结果验证 print(final_sample.describe())
多列条件判断实现
该逻辑完全支持同时校验多列的均值要求,只需要提前把每一列的目标均值、允许误差定义好,每次抽样后遍历校验所有条件即可,示例代码如下:
# 配置多列校验规则:键为列名,值为(目标均值, 允许误差) target_rules = { 'score': (1.699, 0.001), 'age': (34.7, 0.2), # 示例:age列目标均值34.7,允许误差0.2 'order_count': (8.3, 0.1) # 示例:订单数列目标均值8.3,允许误差0.1 } final_sample = None while True: current_sample = df.sample(n=533, weights='weightsScore') all_match = True for col, (target, tol) in target_rules.items(): col_mean = current_sample[col].mean() if abs(col_mean - target) > tol: all_match = False break if all_match: final_sample = current_sample break print(final_sample.describe())
注意:如果同时校验的列数过多、容差设置过小,循环运行时间会大幅变长。可以先调整抽样权重,让各列的抽样期望均值尽量接近目标值,再运行循环,能显著缩短等待时间。
内容的提问来源于stack exchange,提问作者bhristxpher
相关产品推荐
相关产品推荐

