Search code examples
pythonpandassortingindexingcategorical-data

How to sort a pandas dataframe by a custom order on a string index


I have the following dataframe:

import pandas as pd

df = pd.DataFrame({'id': [2967, 5335, 13950, 6141, 6169],
                   'Player': ['Cedric Hunter', 'Maurice Baker',
                              'Ratko Varda', 'Ryan Bowen', 'Adrian Caldwell'],
                   'Year': [1991, 2004, 2001, 2009, 1997],
                   'Age': [27, 25, 22, 34, 31],
                   'Tm': ['CHH', 'VAN', 'TOT', 'OKC', 'DAL'],
                   'G': [6, 7, 60, 52, 81]})


df.set_index('Player', inplace=True)

It shows:

Out[128]:

                 Age   G   Tm  Year     id
Player
Cedric Hunter     27   6  CHH  1991   2967
Maurice Baker     25   7  VAN  2004   5335
Ratko Varda       22  60  TOT  2001  13950
Ryan Bowen        34  52  OKC  2009   6141
Adrian Caldwell   31  81  DAL  1997   6169

How can I sort by the index ('Player') using some arbitrary order? For example, as in the following.

reorderlist = ['Maurice Baker',
               'Adrian Caldwell',
               'Ratko Varda',
               'Ryan Bowen',
               'Cedric Hunter']

Solution

  • Just reindex

    df.reindex(reorderlist)
    Out[89]: 
                     Age   G   Tm  Year     id
    Player                                    
    Maurice Baker     25   7  VAN  2004   5335
    Adrian Caldwell   31  81  DAL  1997   6169
    Ratko Varda       22  60  TOT  2001  13950
    Ryan Bowen        34  52  OKC  2009   6141
    Cedric Hunter     27   6  CHH  1991   2967
    

    Update info you have multiple players with same name

    out = df.iloc[pd.Categorical(df.index,reorderlist).argsort()]