如何根据特定列的值重新排列数据框的行
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重命名为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
【问题讨论】:
【参考方案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.当边缘情况