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

如何在Pandas melt后按Variety列而非Month列排序DataFrame?

Pandas Melt后按Variety分组排序的实现方法

问题背景

给定如下Pandas DataFrame:

import pandas as pd
data = {'Type': ['Fruits', 'Fruits', 'Fruits', 'Fruits'],
        'Name': ['Mango', 'Mango', 'Mango', 'Mango'],
        'Variety': ['Alphonso', 'Dasheri', 'Langra', 'Raspuri'],
        'April':[120,110,90,60],
        'May':[110,80,50,40],
        'June':[80,110,76,65],
        'July':[85,87,55,50]}
df = pd.DataFrame(data)
df=df[['Type','Name','Variety','April','May','June','July']]

初始数据样式:

Type   Name   Variety  April  May  June  July
0  Fruits  Mango  Alphonso    120  110    80    85
1  Fruits  Mango   Dasheri    110   80   110    87
2  Fruits  Mango    Langra     90   50    76    55
3  Fruits  Mango   Raspuri     60   40    65    50

执行melt操作后:

ndf=df.melt(id_vars=['Type','Name','Variety'],var_name="Month",value_name="Price")

默认结果会按Month列分组排序,但实际需求是按Variety列分组排序,且每个品种下的月份保持April→May→June→July的原始顺序,期望样式如上所示。

解决方法

方法1:melt后用稳定排序实现

执行melt后,调用sort_values()按Variety排序,同时指定kind='mergesort'(稳定排序算法,不会打乱同品种内月份的原有顺序),最后重置索引:

ndf = df.melt(id_vars=['Type','Name','Variety'],var_name="Month",value_name="Price")
# 按Variety排序,保留同品种下月份的原始顺序
ndf_sorted = ndf.sort_values(by='Variety', kind='mergesort').reset_index(drop=True)

方法2:将Month转为类别型(更严谨)

如果需要确保月份始终按指定顺序排列,可先将Month列转为有序类别,再按Variety和Month排序:

# 定义固定的月份顺序
month_order = ['April', 'May', 'June', 'July']

# 执行melt操作
ndf = df.melt(id_vars=['Type','Name','Variety'],var_name="Month",value_name="Price")

# 将Month转为有序类别
ndf['Month'] = pd.Categorical(ndf['Month'], categories=month_order, ordered=True)

# 按Variety和Month排序,重置索引
ndf_sorted = ndf.sort_values(by=['Variety', 'Month']).reset_index(drop=True)

两种方法都能得到符合需求的排序结果,方法2更适合需要长期保证月份顺序的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:52:44