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

新手上路,请多包涵

我有以下数据框:

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

我怎样才能做到这一点?

原文由 littleworth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 375
2 个回答

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

更新信息你有多个同名玩家

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

原文由 BENY 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 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.Categoricalcolumn.map 我在评论中提出的替代方案之间可能存在一些实际差异。例如,请参阅这些 警告。为了完整起见,我同时展示了两者。我也没有测试这与当前接受的使用 df.reindex 的解决方案在性能方面的比较。当您也有 MultiIndex 时,最佳方法可能会有所不同。

原文由 totalhack 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题