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

如何按随机循环重复模式对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:39:35