我有以下数据框:
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()
我该怎么做?
答案 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
时,最佳方法也可能会有所不同。