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

如何用Python按特定顺序轮换数据集?以鸢尾花数据集为例

实现鸢尾花数据集的轮换排列与排序方案

核心思路

要实现「物种优先级高于花瓣长度排序」的轮换排列,关键是给每个物种内的行标记轮次序号,再通过轮次+物种的组合排序达成轮换效果,全程用pandas矢量化操作保证百万级数据的处理效率。具体步骤:

  1. 按物种分组,每组内按petal length降序排序
  2. 给每组内的行分配轮次索引(同位置的行属于同一轮)
  3. 先按轮次索引排序,再按物种顺序排序,实现1、2、3的轮换逻辑
  4. 计算% 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:32:20