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

Pandas中按Category分组后随机抽取单个ID的实现方法

按Category随机抽取ID并获取对应行数据

原始数据

首先定义示例数据:

import pandas as pd
data = pd.DataFrame(data={'ID':[1, 1, 2, 2, 3, 3], 'prod':['A', 'B', 'C','D', 'E', 'F'], 'category':['cat1', 'cat1', 'cat1', 'cat1', 'cat2', 'cat2']})

实现步骤

方法一:先获取随机ID再筛选

  1. 按category分组,提取每组的唯一ID并随机选择一个:
# 生成每个category对应的随机ID
random_id_map = data.groupby('category')['ID'].unique().apply(lambda ids: pd.Series(ids).sample(1).iloc[0])
  1. 根据category和随机ID筛选原数据:
# 将映射转为可匹配的元组列表
match_pairs = random_id_map.reset_index().values.tolist()
# 筛选符合条件的行
result = data[data.set_index(['category', 'ID']).index.isin(match_pairs)]

方法二:分组后直接筛选

通过groupby结合filter一步完成:

result = data.groupby(['category', 'ID']).filter(
    lambda group: group.name[1] == group.groupby('category')['ID'].unique().apply(lambda ids: pd.Series(ids).sample(1).iloc[0])
)

方法三:合并映射表

利用merge实现筛选:

# 生成每个category的随机ID映射
cat_id_map = data.groupby('category')['ID'].agg(lambda x: x.unique()[pd.np.random.randint(0, len(x.unique()))])
# 合并原数据与映射表,自动筛选匹配行
result = data.merge(cat_id_map.reset_index(), on=['category', 'ID'])

示例输出

某次随机运行的结果可能如下:

ID prod category
0   1    A     cat1
1   1    B     cat1
4   3    E     cat2
5   3    F     cat2

(每次运行结果会因随机抽样不同而变化)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:50:23