如何按字符串索引上的自定义顺序对pandas数据帧进行排序

sca*_*der 8 python sorting indexing pandas categorical-data

我有以下数据框:

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)
Run Code Online (Sandbox Code Playgroud)

表明:

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
Run Code Online (Sandbox Code Playgroud)

我想要做的是根据此列表以任意顺序对"播放器"索引进行排序(注意:不是字母顺序):

reorderlist = [ 'Maurice Baker', 'Adrian Caldwell','Ratko Varda' ,'Ryan Bowen' ,'Cedric Hunter']
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

WeN*_*Ben 18

只是 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
Run Code Online (Sandbox Code Playgroud)


tot*_*ack 6

从 Pandas 1.1 开始,DataFrame.sort_values有一个key参数,它接受一个可调用来控制排序。因此,您可以使用如下方法:

def sorter(column):
    reorder = [
        "Maurice Baker",
        "Adrian Caldwell",
        "Ratko Varda",
        "Ryan Bowen",
        "Cedric Hunter",
    ]
    # This also works:
    # mapper = {name: order for order, name in enumerate(reorder)}
    # return column.map(mapper)
    cat = pd.Categorical(column, categories=reorder, ordered=True)
    return pd.Series(cat)

df_sorted = df.sort_values(by="Player", key=sorter)
Run Code Online (Sandbox Code Playgroud)

使用pd.Categoricalcolumn.map我在评论中提出的替代方案之间可能存在一些实际差异。例如,请参阅这些警告。为了完整起见,我都展示了两者。我也没有测试这与当前接受的使用df.reindex. 当你也有一个MultiIndex在玩时,最好的方法可能会有所不同。

  • 不是所有的英雄穿着斗篷!显然,有些人戴着围巾! (5认同)