基于成绩从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
相关产品推荐
相关产品推荐

