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