按特定顺序对Pandas DataFrame中的列进行排序

spa*_*row 4 python pandas

鉴于此DataFrame:

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)

我想按顺序对A列进行排序:7月,8月,9月.是否有某种方法可以使用类似"sort_values"的排序函数,但是按值预先定义排序顺序?

Yuc*_*uca 9

定义字典中的顺序并根据它排序

sort_dict = {'July':0,'August':1,'Sept':2}
df.iloc[df['A'].map(sort_dict).sort_values().index]
Run Code Online (Sandbox Code Playgroud)

输出

       A    B
1   July    3
0   August  2
2   Sept    6
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 8

运用 Categorical

df.A=pd.Categorical(df.A,categories=['July', 'August', 'Sept'])
df=df.sort_values('A')
df
Out[310]: 
        A  B
1    July  3
0  August  2
2    Sept  6
Run Code Online (Sandbox Code Playgroud)


小智 8

从pandas 1.1.0版本开始,sort_values支持按key排序。

df = df.sort_values('A', key=lambda s: s.apply(['July', 'August', 'Sept'].index), ignore_index=True)
Run Code Online (Sandbox Code Playgroud)


Sco*_*ton 4

您是否反对使用完整的月份名称或一致的缩写?

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])

df

import calendar

df = df.replace({'Sept':'September'})

calendar.month_name[1:]
Run Code Online (Sandbox Code Playgroud)

输出:

['January',
 'February',
 'March',
 'April',
 'May',
 'June',
 'July',
 'August',
 'September',
 'October',
 'November',
 'December']

df['A'] = pd.Categorical(df.A, categories=calendar.month_name[1:], ordered=True)

df.sort_values('A')
Run Code Online (Sandbox Code Playgroud)

输出:

           A  B
1       July  3
0     August  2
2  September  6
Run Code Online (Sandbox Code Playgroud)

或者使用calendar.month_abbr

calendar.month_abbr[1:]
Run Code Online (Sandbox Code Playgroud)

输出:

['Jan',
 'Feb',
 'Mar',
 'Apr',
 'May',
 'Jun',
 'Jul',
 'Aug',
 'Sep',
 'Oct',
 'Nov',
 'Dec']
Run Code Online (Sandbox Code Playgroud)