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

如何在Python中实现Pandas分组按不同比例条件抽样?

问题分析与解决

原代码的核心问题是判断条件写错了:'group' == 0是拿字符串和数字做比较,永远不成立,导致所有组都执行全量采样,达不到需求。

正确实现方式

方式一:修正Lambda判断逻辑

直接在Lambda里获取当前组的group值,判断后执行对应采样:

import pandas as pd

# 构造数据
df = pd.DataFrame([['billy', 1, 0, 1], ['bob', 0, 1, 1], ['sam', 1, 1, 0], ['sally', 0, 1, 0]], 
                  columns=['name', 'group', 'feature_a', 'feature_b'])

# 分组采样
grouped = df.groupby('group')
new_df = grouped.apply(lambda x: x.sample(frac=0.5) if x['group'].iloc[0] == 0 else x).reset_index(drop=True)

print(new_df)

方式二:使用单独采样函数(可读性更强)

把采样逻辑封装成函数,通过groupby.apply调用:

import pandas as pd

df = pd.DataFrame([['billy', 1, 0, 1], ['bob', 0, 1, 1], ['sam', 1, 1, 0], ['sally', 0, 1, 0]], 
                  columns=['name', 'group', 'feature_a', 'feature_b'])

def sample_group(group):
    # group.name就是当前组的group值
    if group.name == 0:
        return group.sample(frac=0.5)
    return group

new_df = df.groupby('group').apply(sample_group).reset_index(drop=True)

print(new_df)

说明

  • 两种方式都会对组0随机采样50%(原数据组0共2行,会保留1行),组1保留全部2行,最终结果和你给出的df1或df2一致。
  • 最后调用reset_index(drop=True)是为了清理分组后产生的多级索引,得到整洁的结果。

内容的提问来源于stack exchange,提问作者jw32022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:45:36