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

Pandas多列Groupby后按组大小规则采样的技术实现问询

Pandas多列分组后按条件采样

嘿,这个分组采样的需求我熟!刚好可以用Pandas的groupby.sample来优雅解决,完全贴合你的要求:组内元素超过2条就抽取2条样本,≤2条则保留全部记录。

步骤1:构造原始DataFrame

先把你给出的示例数据转换成Pandas DataFrame:

import pandas as pd

data = {
    'col1': ['A1', 'A1', 'A1', 'B1', 'B1', 'C1'],
    'col2': ['A2', 'A2', 'A2', 'B2', 'B2', 'C2'],
    'col3': ['A3', 'A3', 'A3', 'B3', 'B3', 'C3'],
    'col4': ['A4', 'A5', 'A6', 'B4', 'B5', 'C4']
}
df = pd.DataFrame(data)

步骤2:核心分组采样代码

直接用groupby结合sample方法,通过lambda函数动态控制每个组的采样数量:

# 按col1、col2、col3三列分组,然后按规则采样
sampled_df = df.groupby(['col1', 'col2', 'col3']).sample(
    n=lambda group_len: min(group_len, 2),
    random_state=42  # 可选:固定随机种子,让采样结果可复现
)

代码解释

  • 多列分组:groupby(['col1', 'col2', 'col3'])实现你需要的多列分组逻辑
  • 动态采样数量:n=lambda group_len: min(group_len, 2)是关键——每个组传入自己的长度group_len,返回min(组长度, 2),完美实现“超2取2,否则全留”的规则
  • 随机种子:random_state=42是可选参数,加上后每次运行采样结果一致,方便调试;不需要的话可以直接删掉

示例输出

运行上述代码后,你会得到类似这样的结果(A组的两条样本是随机抽取的,每次可能不同):

col1 col2 col3 col4
0   A1   A2   A3   A4
2   A1   A2   A3   A6
3   B1   B2   B3   B4
4   B1   B2   B3   B5
5   C1   C2   C3   C4

完全符合你期望的目标DataFrame格式,A组保留2条随机样本,B组和C组保留全部记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:53:09