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

时间:2018-04-25 00:44:39

标签: python pandas sorting indexing categorical-data

我有以下数据框:

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']

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

process()

我该怎么做?

3 个答案:

答案 0 :(得分:11)

只需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

答案 1 :(得分:3)

要在字符串列表中获取自定义排序顺序,请将其声明为分类并手动指定排序中的顺序:

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

这是因为pandas还不允许将分类作为索引:df.set_index(keys=player_order, inplace=True) TypeError: unhashable type: 'Categorical'

因此,您希望使用df.sort_index(level=player_order)

进行手动自定义排序

答案 2 :(得分:1)

从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)

使用pd.Categorical和我在评论中添加的column.map之间可能存在一些实际差异。例如,请参见这些caveats。我展示这两者是为了完整性。我还没有测试过如何将性能与使用df.reindex的当前公认解决方案进行比较。当您同时玩MultiIndex时,最佳方法也可能会有所不同。