如何按自定义顺序重排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
相关产品推荐
相关产品推荐

