如何在DataFrame列中实现通用手动分组分段逻辑?
实现DataFrame团队的手动分段分组(每组3个,最后一组可含2个)
实现思路
- 先对目标列排序,确保分组按固定顺序生成
- 基于排序后的连续索引生成初始分组(每3个团队一组)
- 处理特殊场景:当团队总数除以3余1时,调整最后两组为各2个团队,避免出现单组1个的情况
- 将分组编号转为直观的命名格式(如"组1""组2")
完整代码
import pandas as pd import numpy as np def create_team_groups(df, team_col): # 按指定团队列排序并重置索引,保证索引连续 sorted_df = df.sort_values(by=team_col).reset_index(drop=True) total_teams = len(sorted_df) # 生成初始分组:每3个团队划分为一组 group_ids = np.arange(total_teams) // 3 # 处理总数除以3余1的情况:调整最后两组为各2个团队 if total_teams % 3 == 1 and total_teams >= 4: group_ids[-2] = group_ids[-1] # 转换为易读的分组名称 sorted_df['分组'] = '组' + (group_ids + 1).astype(str) return sorted_df
使用示例
假设你有如下测试数据:
# 生成14个团队的测试DataFrame team_data = pd.DataFrame({'团队名称': [f'团队{i}' for i in range(1, 15)]}) # 调用函数生成分组 grouped_data = create_team_groups(team_data, '团队名称') # 查看分组分布 print(grouped_data['分组'].value_counts())
输出结果:
组1 3 组2 3 组3 3 组4 3 组5 2 Name: 分组, dtype: int64
代码说明
- 排序与索引重置:
sort_values保证团队按指定列排序,reset_index让索引从0开始连续,为后续分组计算提供基础 - 初始分组生成:通过
np.arange(total_teams) // 3快速生成每3个一组的编号,高效且简洁 - 特殊情况适配:当团队总数除以3余1且总数≥4时,调整倒数第二个团队的分组编号,让最后两组各含2个团队,避免出现单组1个的不合理情况
- 分组名称格式化:将数字编号转为"组X"的格式,更符合日常使用习惯
该函数完全通用,无论团队数量如何变化,都能自动适配分组规则。
内容的提问来源于stack exchange,提问作者Alon
相关产品推荐
相关产品推荐

