web-dev-qa-db-ja.com

文字列インデックスのカスタムオーダーでpandasデータフレームを並べ替える方法

次のデータフレームがあります。

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)

それが示している:

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

私がしたいことは、このリストに従って任意の順序で「プレーヤー」インデックスをソートすることです(注:アルファベット順ではありません)。

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

どうやってやるの?

10
scamander

ただ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

文字列のリストでカスタムの並べ替え順序を取得するには、それをカテゴリとして宣言し、その順序を並べ替えで手動で指定します。

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

これは、pandasがCategoricalsをインデックスとしてまだ許可していないためです:df.set_index(keys=player_order, inplace=True) _TypeError: unhashable type: 'Categorical'_

したがって、df.sort_index(level=player_order)を使用して手動でカスタムソートを行う必要があります

3
smci