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

基于成绩从28人中随机生成4组各7人的分组方案需求

人员分组解决方案

问题背景

现有28名人员按成绩分为A-G共7个等级,每个等级各4人,数据可通过以下代码生成:

import pandas as pd

df = pd.DataFrame({
    "Player": ['Sean','Greg','Mike','George','Smith','Brent','Dave','Sandy','Bob','Rob','Anthony','Tony','Todd','Vic','Lima','Bina','Mark','Jerry','Rao','Chris','Nick','Flint','Styne','Dale','Stoli','Popov','Glen','Maxwell'], 
    "Grade": ['A','B','C','D','E','F','G','A','B','C','D','E','F','G','A','B','C','D','E','F','G','A','B','C','D','E','F','G']
})

需求是将这28人分为4个团队,每个团队7人且必须包含A-G所有等级,每次运行代码需生成随机不同的分组结果。此前尝试的代码仅能生成1组,需手动删减数据重复执行,且随机性不足:

df.groupby('Grade').apply(lambda x: x.iloc[np.random.choice(range(0, len(x)))])

解决代码

以下代码可满足需求,每次运行生成随机分组:

import pandas as pd
import numpy as np

# 生成原始数据
df = pd.DataFrame({
    "Player": ['Sean','Greg','Mike','George','Smith','Brent','Dave','Sandy','Bob','Rob','Anthony','Tony','Todd','Vic','Lima','Bina','Mark','Jerry','Rao','Chris','Nick','Flint','Styne','Dale','Stoli','Popov','Glen','Maxwell'], 
    "Grade": ['A','B','C','D','E','F','G','A','B','C','D','E','F','G','A','B','C','D','E','F','G','A','B','C','D','E','F','G']
})

# 核心分组逻辑
# 1. 按等级分组后,对每个等级的人员随机打乱顺序
shuffled_df = df.groupby('Grade').apply(lambda x: x.sample(frac=1)).reset_index(drop=True)
# 2. 给每个等级的4名人员分配4个团队编号(0-3)
shuffled_df['Team'] = shuffled_df.groupby('Grade').cumcount()
# 3. 按团队编号分组,得到最终结果
teams = shuffled_df.groupby('Team')

# 输出每个团队的人员信息
for team_num, team_data in teams:
    print(f"=== 团队 {team_num+1} ===")
    print(team_data[['Player', 'Grade']])
    print("\n")

逻辑说明

  • 随机打乱:通过sample(frac=1)对每个等级内的人员随机重排,保证每次分组的随机性
  • 分配团队号:cumcount()为每个等级内的人员生成0-3的序号,刚好对应4个团队,确保每个等级的4人分别进入不同团队
  • 分组结果:按团队号聚合后,每个团队自然包含A-G所有等级,且人数为7人(7个等级各1人)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:18:22