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

Posted

技术标签:

【中文标题】如何根据特定列的值重新排列数据框的行【英文标题】:How to rearrange rows of a dataframe according to the values of a specific column 【发布时间】:2021-12-19 08:55:20 【问题描述】:

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

我想把 2017 赛季的所有行都带到 2016 赛季行之后。

数据长这样,(将id重命名为ma​​tch_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

【问题讨论】:

【参考方案1】:

第一个想法是按 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)

【讨论】:

是的,从这两个查询中可以看出,赛季的顺序是安排好的(2017 年在 2016 年和 2018 年之间),但是现在 match/id 顺序是错误的。 原来的id列值是这样的,season: 2017 id range: 1-59, season: 2008 id range: 60-11 经过这些查询,现在每个季节的id序列都是这样的。即现在 2017 年的 id 序列是 1,59,28,27,26,.....,42,43,44,40。 2019年的id序列为11332,11335,11334,11333,....,11317,11318,11319,11321。注意:id 不是索引,它是一个列。 根据 id 列,行的顺序应该是,(从 2008 年到 2019 年)。 2008 年 60-117、2009 年 118-174、......、2016 年 577-638、2017 年 1-59、2018 年 7894-7953、2019 年 11137-11415。 再次查看问题。 @FaheeemSajjad - 需要排序吗?所以第一个解决方案更改为df = df.sort_values(['season', 'match_id'], ignore_index=True) ?

以上是关于如何根据特定列的值重新排列数据框的行的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

如何将命名向量作为行添加到数据框中,根据列名顺序重新排序?

用数据框的NaN替换特定范围的值

如何通过在python中添加同一列的2个不同行值的值来估算特定的行值

如何根据列的值对观察值重新编号[重复]

来自 pandas 数据框的 2 列的 Seaborn 散点图