## 问题：如何从一列中排序熊猫数据框

``````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``````

I have a data frame like this:

``````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
``````

As you can see, months are not in calendar order. So I created a second column to get the month number corresponding to each month (1-12). From there, how can I sort this data frame according to calendar months’ order?

## 回答 0

``````In [18]:
df.sort_values('2')

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

Use `sort_values` to sort the df by a specific column’s values:

``````In [18]:
df.sort_values('2')

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

If you want to sort by two columns, pass a list of column labels to `sort_values` with the column labels ordered according to sort priority. If you use `df.sort_values(['2', '0'])`, the result would be sorted by column `2` then column `0`. Granted, this does not really make sense for this example because each value in `df['2']` is unique.

## 回答 1

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

I tried the solutions above and I do not achieve results, so I found a different solution that works for me. The ascending=False is to order the dataframe in descending order, by default it is True. I am using python 3.6.6 and pandas 0.23.4 versions.

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

You can see more details in pandas documentation here.

## 回答 2

``````ID         cost      tax    label
1       216590      1600    test
2       523213      1800    test
3          250      1500    experiment

(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)``````

`sorted`标签输出作为`dataframe`

``````    index   label
0   test        2
1   experiment  1``````

Just adding some more operations on data. Suppose we have a dataframe `df`, we can do several operations to get desired outputs

``````ID         cost      tax    label
1       216590      1600    test
2       523213      1800    test
3          250      1500    experiment

(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)
``````

will give `sorted` output of labels as a `dataframe`

``````    index   label
0   test        2
1   experiment  1
``````

## 回答 3

``````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)``````

Just as another solution:

Instead of creating the second column, you can categorize your string data(month name) and sort by that like this:

``````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)
``````

It will give you the ordered data by `month name` as you specified while creating the `Categorical` object.