如何根据特定列的值重新排列数据框的行

How to rearrange rows of a dataframe according to the values of a specific column

我正在处理一个数据框,其中有一列名为 season。每个赛季都有很多场比赛。季节顺序将重新安排。 赛季顺序为 2017,2008,2009,2010,2011,2012,2013,2014,2015,2016,2018,2019.

我想在 2016 赛季行之后引入 2017 赛季的所有行。

数据是这样的,(将id重命名为match_id,这里显示的列很少,总共有是 18)

    match_id    season  city        winner
0   1           2017    Hyderabad   Sunrisers Hyderabad
1   2           2017    Pune        Rising Pune Supergiant
2   3           2017    Rajkot      Kolkata Knight Riders   
3   4           2017    Indore      Kings XI Punjab
4   5           2017    Bangalore   Royal Challengers Bangalore 

我试过了,

df.set_index('season')

然后,

df.reindex([2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,2016, 2017, 2018, 2019])

但输出很糟糕,

        match_id    season  city    winner
2008    NaN         NaN     NaN     NaN 
2009    NaN         NaN     NaN     NaN
2010    NaN         NaN     NaN     NaN
2011    NaN         NaN     NaN     NaN
2012    NaN         NaN     NaN     NaN
2013    NaN         NaN     NaN     NaN
2014    NaN         NaN     NaN     NaN
2015    NaN         NaN     NaN     NaN
2016    NaN         NaN     NaN     NaN
2017    NaN         NaN     NaN     NaN
2018    NaN         NaN     NaN     NaN
2019    NaN         NaN     NaN     NaN

第一个想法是按顺序分类排序 list:

L =[2008,2009, 2010, 2011, 2012, 2013, 2014, 2015,2016,2017, 2018, 2019]
df['season'] = pd.Categorical(df['season'], ordered=True, categories=L)

df = df.sort_values(['season','match_id'], ignore_index=True)

或者您可以创建带有枚举的字典,以便在 key 参数中进行映射:

L =[2008,2009, 2010, 2011, 2012, 2013, 2014, 2015,2016,2017, 2018, 2019]

d = {v: k for k, v in enumerate(L)}
df = df.sort_values('season', key = lambda x: x.map(d), ignore_index=True)