如何从dataframe中提取匹配指定分组顺序的随机有序序列
解决方案
要实现按指定分组顺序随机抽取对应行,核心逻辑是先预存各分组的行作为采样池,再按传入的分组序列逐次采样拼接,完全匹配目标顺序,同时支持同一分组重复抽取的场景。
实现代码
import pandas as pd # 示例数据构造 df = pd.DataFrame({ 'ID': [1,2,3,12,13,84,85], 'Field_1': ['ABC','BCD','EEJ','KAS','OEP','HJH','YSU'], 'Field_2': ['XYZ','ABF','KYA','UUY','PLO','HIE','SAR'], 'Group': ['B','B','B','Z','Z','N','N'] }) # 1. 预构建各分组的采样池,仅需执行一次 group_pool = dict(tuple(df.groupby('Group'))) def sample_by_group_order(target_order: list, replace: bool = False) -> pd.DataFrame: """ 按指定分组顺序返回随机采样的行 :param target_order: 目标分组序列,如['B','Z','N','B'] :param replace: 是否允许重复抽取同一行,默认不允许 """ sample_list = [] for group_name in target_order: # 从对应分组随机抽1行 sampled_row = group_pool[group_name].sample(n=1, replace=replace) sample_list.append(sampled_row) # 按顺序拼接结果并重置索引 return pd.concat(sample_list, ignore_index=True) # 调用示例 result = sample_by_group_order(['B','Z','N','B']) print(result)
效果说明
- 输出的行顺序完全和传入的
target_order一致,示例调用返回的行顺序依次是B组随机行、Z组随机行、N组随机行、B组另一随机行 - 如果某分组需要抽取的次数超过该分组的总行数,设置
replace=True即可允许重复抽取同一行 - 多次调用时预构建的
group_pool可复用,无需重复执行分组逻辑,性能更高
内容的提问来源于stack exchange,提问作者rshah
相关产品推荐
相关产品推荐

