web-dev-qa-db-fra.com

Comment trier pandas dataframe par commande personnalisée sur l'index de chaîne

J'ai la trame de données suivante:

import pandas as pd

# Create DataFrame
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)

Ça montre:

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

Ce que je veux faire, c'est trier l'index 'Player' dans l'ordre arbitraire selon cette liste (REMARQUE: pas dans l'ordre alphabétique):

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

Comment puis je faire ça?

10
scamander

Juste 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
21
YOBEN_S

Pour obtenir un ordre de tri personnalisé sur votre liste de chaînes, déclarez-le comme catégorique et spécifiez manuellement cet ordre dans un tri:

player_order = pd.Categorical([ 'Maurice Baker', 'Adrian Caldwell','Ratko Varda' ,'Ryan Bowen' ,'Cedric Hunter'],
              ordered=True)

En effet, pandas n'autorise pas encore les catégoriels comme indices: df.set_index(keys=player_order, inplace=True)TypeError: unhashable type: 'Categorical'

Vous souhaiterez donc effectuer un tri manuel personnalisé à l'aide de df.sort_index(level=player_order)

3
smci