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

如何用Pandas从数据集无放回随机选取n个分组?

嘿,我来帮你搞定这两个Pandas分组抽样的问题,都是日常处理数据时很常见的场景!

问题1:从大型数据集中随机选取n个分组

处理大型数据集时,效率是关键——直接对整个数据集分组再抽样可能会吃满内存,所以推荐先提取所有唯一分组,再抽样,最后筛选原数据的思路:

  1. 先获取所有不重复的分组标签:
unique_groups = df['label'].unique()
  1. 从这些唯一分组里无放回抽n个(两种方法任选其一):
# 方法1:用numpy的随机选择
import numpy as np
selected_groups = np.random.choice(unique_groups, size=n, replace=False)

# 方法2:用Pandas自带的抽样方法
selected_groups = pd.Series(unique_groups).sample(n=n, replace=False).values
  1. 用筛选器把原数据中属于选中分组的行捞出来:
sampled_df = df[df['label'].isin(selected_groups)]

这个方法的好处是内存效率极高,因为只需要处理分组标签的小集合,不用加载整个分组后的数据集。

问题2:针对特定结构DataFrame的无放回分组抽样

你提到的DataFrame结构(val列全为x,label列是A、A、B、B...这样的重复分组),核心逻辑和问题1一致,只是每个分组固定对应两行数据。这里可以用两种方式实现:

方式一:通用高效法

直接复用问题1的代码就行,isin会自动把每个选中分组的所有行都保留下来,完美适配你的结构:

unique_labels = df['label'].unique()
selected_labels = pd.Series(unique_labels).sample(n=n, replace=False).values
sampled_df = df[df['label'].isin(selected_labels)]

方式二:先分组再抽样(适合验证分组完整性)

如果你想直观确认抽样时每个分组的所有行都被选中,可以先按label分组,再抽样分组对象:

# 按label分组,抽样n个分组(sample(n=1)是从每个组抽1行,用来标记选中的组)
selected_group_labels = df.groupby('label').sample(n=1, replace=False)['label'].unique()
# 筛选原数据
sampled_df = df[df['label'].isin(selected_group_labels)]

这个方法虽然多了一步分组,但能清晰看到被选中的分组,适合需要确认分组完整性的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:35