如何用Python按特定顺序轮换数据集?以鸢尾花数据集为例
实现鸢尾花数据集的轮换排列与排序方案
核心思路
要实现「物种优先级高于花瓣长度排序」的轮换排列,关键是给每个物种内的行标记轮次序号,再通过轮次+物种的组合排序达成轮换效果,全程用pandas矢量化操作保证百万级数据的处理效率。具体步骤:
- 按物种分组,每组内按
petal length降序排序 - 给每组内的行分配轮次索引(同位置的行属于同一轮)
- 先按轮次索引排序,再按物种顺序排序,实现1、2、3的轮换逻辑
- 计算
% dist列:各物种花瓣长度总和 / 全局花瓣长度总和
代码实现
import pandas as pd from sklearn.datasets import load_iris # 加载鸢尾花数据集 iris = load_iris() df = pd.DataFrame(data=iris.data, columns=iris.feature_names) df['species'] = iris.target + 1 # 转换为1、2、3的物种编号 # 1. 按物种分组,组内按花瓣长度降序排序 df_sorted = df.sort_values(by=['species', 'petal length (cm)'], ascending=[True, False]) # 2. 给每个物种内的行添加轮次索引(组内行号,从0开始) df_sorted['round_idx'] = df_sorted.groupby('species').cumcount() # 3. 按轮次、物种排序,实现轮换排列 result = df_sorted.sort_values(by=['round_idx', 'species']) # 4. 计算% dist列 total_petal_sum = df['petal length (cm)'].sum() species_petal_sum = df.groupby('species')['petal length (cm)'].sum() result['% dist'] = result['species'].map(species_petal_sum) / total_petal_sum result['% dist'] = result['% dist'].round(4) # 按需保留小数位数 # 清理临时列 result = result.drop(columns=['round_idx']) # 查看结果示例 print(result.head(10))
关键说明
- 轮次索引的作用:每个物种内最长花瓣的行轮次为0,次长为1,以此类推。按轮次排序后,所有轮次0的行先按物种1、2、3排列,接着是轮次1的行,完美实现轮换逻辑。
- 效率保障:全程使用pandas分组、排序、矢量化映射操作,无显式循环,处理百万级数据无性能压力。
- 行数不一致处理:若某物种行数更多,多余的行会在后续轮次继续排列(比如物种1有100行、物种2有80行,轮次80-99仅显示物种1的记录)。
内容的提问来源于stack exchange,提问作者mangopie
相关产品推荐
相关产品推荐

