我有一个这样的数据帧:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

如您所见,月份不是按日历顺序排列的。因此,我创建了第二列来获取每个月对应的月份号(1-12)。在此基础上,如何根据日历月份的顺序对数据帧进行排序?


当前回答

作为另一种解决方案:

而不是创建第二列,你可以对你的字符串数据(月份名)进行分类,并像这样排序:

df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)

它将按照您在创建Categorical对象时指定的月份名称为您提供有序数据。

其他回答

这对我很有效

df.sort_values(by='Column_name', inplace=True, ascending=False)

如果您想动态排序列,而不是按字母顺序排序。 并且不想使用pd.sort_values()。 你可以试试下面的解决方案。

问题:在这个序列['A', 'C', 'D', 'B']中排序列"col1"

import pandas as pd
import numpy as np

## Sample DataFrame ##
df = pd.DataFrame({'col1': ['A', 'B', 'D', 'C', 'A']})

>>> df
   col1
0    A
1    B
2    D
3    C
4    A
## Solution ##

conditions = []
values = []

for i,j in enumerate(['A','C','D','B']):
    conditions.append((df['col1'] == j))
    values.append(i)

df['col1_Num'] = np.select(conditions, values)

df.sort_values(by='col1_Num',inplace = True)

>>> df

    col1  col1_Num
0    A         0
4    A         0
3    C         1
2    D         2
1    B         3

我尝试了上面的解决方案,但没有达到效果,所以我找到了一个适合我的不同的解决方案。升序=False是将数据帧按降序排列,默认情况下为True。我使用的是python 3.6.6和pandas 0.23.4版本。

final_df = df.sort_values(by=['2'], ascending=False)

你可以在pandas文档中看到更多细节。

作为另一种解决方案:

而不是创建第二列,你可以对你的字符串数据(月份名)进行分类,并像这样排序:

df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)

它将按照您在创建Categorical对象时指定的月份名称为您提供有序数据。

这个对我很有用:

df=df.sort_values(by=[2])

而:

df=df.sort_values(by=['2']) 

不起作用。