如何在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
相关产品推荐
相关产品推荐

