如何按随机循环重复模式对Pandas DataFrame进行排序?
如何按随机循环重复模式对Pandas DataFrame进行排序?
我完全懂你的需求——你希望把DataFrame里的名字条目尽量均匀地穿插排列,而且每次的排序顺序是随机的(不会固定死循环顺序),同时必须保留所有行,确保哪怕只查看前20%的数据,每个名字都有平等的出现机会。这个需求可以通过「分组分配批次+随机定义循环顺序」来实现,具体步骤如下:
步骤1:准备示例数据
先把你给出的示例数据转换成Pandas DataFrame:
import pandas as pd import numpy as np # 构造你的示例数据 data = { 'Name': ['Sam', 'John', 'Amy', 'Sam', 'Sam', 'Amy', 'Sam', 'Amy', 'Sarah', 'John', 'Sam'], 'Score': ['2','3','5','4','6','10','8','15','7','9', '12'] } df = pd.DataFrame(data)
步骤2:给每个名字的条目分配「批次号」
我们先按名字分组,给每个名字下的条目分配一个递增的序号(相当于这个条目在自己名字组里的“批次”)。比如Sam有5条数据,它的批次号就是0、1、2、3、4;Amy有3条,批次号是0、1、2,以此类推:
# 给每个名字的条目分配组内序号(批次号) df['batch'] = df.groupby('Name').cumcount()
步骤3:生成随机的名字循环顺序
接下来随机打乱所有唯一名字的顺序,这个顺序就是我们后续循环的基础(每次运行都会生成不同的顺序,避免固定循环):
# 随机打乱唯一名字的顺序,作为循环排序的依据 random_name_order = np.random.permutation(df['Name'].unique()) # 把名字映射成排序用的优先级数值 name_rank = {name: idx for idx, name in enumerate(random_name_order)} df['name_rank'] = df['Name'].map(name_rank)
步骤4:按批次+随机名字顺序排序
最后我们先按批次号升序排序,同一批次内再按刚才生成的随机名字顺序排序,这样就能实现“每个批次里按随机顺序循环出现各名字的条目”,同时保证所有行都被保留:
# 执行排序,然后删除辅助列 sorted_df = df.sort_values(by=['batch', 'name_rank']).drop(columns=['batch', 'name_rank']) # 重置索引(可选,根据你的需求决定是否保留) sorted_df = sorted_df.reset_index(drop=True) # 查看结果 print(sorted_df)
效果说明
运行这段代码后,你会得到类似这样的结果(因为名字顺序是随机的,每次输出会略有不同):
Name Score 0 Sarah 7 1 Amy 5 2 Sam 2 3 John 3 4 Amy 10 5 Sam 4 6 John 9 7 Amy 15 8 Sam 6 9 Sam 8 10 Sam 12
这个结果里,每个名字的条目被均匀穿插在各个批次中,而且每次运行的循环顺序都是随机的,完美满足你的需求:既保证了前20%数据里每个名字都有机会出现,又保留了所有行,还实现了随机循环的效果。
备注:内容来源于stack exchange,提问作者umbrellas
相关产品推荐
相关产品推荐

