Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sort pandas dataframe based on list

Tags:

I would like to sort the following dataframe:

Region           LSE          North      South 0                   Cn     33.330367   9.178917 1               Develd     -36.157025 -27.669988 2               Wetnds    -38.480206 -46.089908 3                Oands    -47.986764 -32.324991 4               Otherg    323.209834  28.486310 5                 Soys      34.936147   4.072872 6                  Wht     0.983977 -14.972555 

I would like to sort it so the LSE column is reordered based on the list:

lst = ['Oands','Wetnds','Develd','Cn','Soys','Otherg','Wht'] 

of, course the other columns will need to be reordered accordingly as well. Is there any way to do this in pandas?

like image 893
user308827 Avatar asked Nov 03 '14 03:11

user308827


People also ask

How do you sort a DataFrame based on a list?

Sorting Your DataFrame on a Single Column. To sort the DataFrame based on the values in a single column, you'll use . sort_values() . By default, this will return a new DataFrame sorted in ascending order.

How do you sort a DataFrame based on values?

You can sort by column values in pandas DataFrame using sort_values() method. To specify the order, you have to use ascending boolean property; False for descending and True for ascending. By default, it is set to True.

How do I sort values in pandas series?

Sort the Series in Ascending Order By default, the pandas series sort_values() function sorts the series in ascending order. You can also use ascending=True param to explicitly specify to sort in ascending order. Also, if you have any NaN values in the Series, it sort by placing all NaN values at the end.


1 Answers

The improved support for Categoricals in pandas version 0.15 allows you to do this easily:

df['LSE_cat'] = pd.Categorical(     df['LSE'],      categories=['Oands','Wetnds','Develd','Cn','Soys','Otherg','Wht'],      ordered=True ) df.sort('LSE_cat') Out[5]:     Region     LSE       North      South LSE_cat 3       3   Oands  -47.986764 -32.324991   Oands 2       2  Wetnds  -38.480206 -46.089908  Wetnds 1       1  Develd  -36.157025 -27.669988  Develd 0       0      Cn   33.330367   9.178917      Cn 5       5    Soys   34.936147   4.072872    Soys 4       4  Otherg  323.209834  28.486310  Otherg 6       6     Wht    0.983977 -14.972555     Wht 

If this is only a temporary ordering then keeping the LSE column as a Categorical may not be what you want, but if this ordering is something that you want to be able to make use of a few times in different contexts, Categoricals are a great solution.


In later versions of pandas, sort, has been replaced with sort_values, so you would need instead:

df.sort_values('LSE_cat') 
like image 189
Marius Avatar answered Sep 22 '22 19:09

Marius