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再筛选
- 按
category分组,提取每组的唯一ID并随机选择一个:
# 生成每个category对应的随机ID random_id_map = data.groupby('category')['ID'].unique().apply(lambda ids: pd.Series(ids).sample(1).iloc[0])
- 根据
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
相关产品推荐
相关产品推荐

