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

如何按自定义顺序重排DataFrame的value_counts与groupby中位数结果

问题描述

我有一个包含params和value列的数据集,为统计每个params的数值数量(用作箱线图标签),使用mydf['params'].value_counts()得到结果:

slidingwindow_250     11574
hotspots_1k_100        8454
slidingwindow_500      5793
slidingwindow_100      5366
hotspots_5k_500        3118
slidingwindow_1000     2898
hotspots_10k_1k        1772
slidingwindow_2500     1160
slidingwindow_5000      580
Name: params, dtype: int64

我有params条目自定义顺序列表,希望用于箱线图展示,但使用sort_index(level=myorder)时,函数忽略自定义顺序仍按字母排序:

myorder = ["slidingwindow_100",
          "slidingwindow_250",
          "slidingwindow_500",
          "slidingwindow_1000",
          "slidingwindow_2500",
          "slidingwindow_5000",
          "hotspots_1k_100",
          "hotspots_5k_500",
          "hotspots_10k_1k"]

sizes_bp_log_df['params'].value_counts().sort_index(level=myorder)

执行结果仍为字母排序:

hotspots_10k_1k        1772
hotspots_1k_100        8454
hotspots_5k_500        3118
slidingwindow_100      5366
slidingwindow_1000     2898
slidingwindow_250     11574
slidingwindow_2500     1160
slidingwindow_500      5793
slidingwindow_5000      580
Name: params, dtype: int64

请问如何让value_counts的索引按期望顺序排列?此外,我还会用sizes_bp_log_df.groupby(['params']).median()获取的分组中位数作为箱线图标签坐标,希望该排序方法同样适用。

解决方案

方法1:将params列转为有序分类(Categorical)

这是一劳永逸的方案,后续所有基于params的分组、统计操作都会自动遵循自定义顺序,无需每次手动调整:

import pandas as pd

# 定义自定义顺序
myorder = ["slidingwindow_100",
          "slidingwindow_250",
          "slidingwindow_500",
          "slidingwindow_1000",
          "slidingwindow_2500",
          "slidingwindow_5000",
          "hotspots_1k_100",
          "hotspots_5k_500",
          "hotspots_10k_1k"]

# 将params列转为有序分类
sizes_bp_log_df['params'] = pd.Categorical(sizes_bp_log_df['params'], categories=myorder, ordered=True)

# value_counts自动按自定义顺序输出
counts = sizes_bp_log_df['params'].value_counts()
print(counts)

# 分组中位数也会遵循同样顺序
medians = sizes_bp_log_df.groupby(['params'])['value'].median()
print(medians)

方法2:使用reindex手动指定顺序

如果不想修改原数据集的列类型,可以直接对统计结果用reindex按自定义顺序重新排列:

# 处理value_counts结果
counts = sizes_bp_log_df['params'].value_counts()
counts_sorted = counts.reindex(myorder)
print(counts_sorted)

# 处理分组中位数
medians = sizes_bp_log_df.groupby(['params'])['value'].median()
medians_sorted = medians.reindex(myorder)
print(medians_sorted)

补充说明

  • 若自定义顺序中存在数据里没有的params,reindex会显示为NaN,可添加dropna=True参数过滤:counts.reindex(myorder, dropna=True)
  • 有序分类方法更适合后续多次基于params的可视化或统计操作,一次设置即可持续生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:10:31