我有一个具有多索引的数据框,第一级是company_ID,第二级是时间戳。每月如何根据所有公司的排名来对其排名?
Score
company_idx timestamp
10006 2010-01-31 69.875394
2010-11-30 73.640693
2010-12-31 73.286248
2011-01-31 73.660052
2011-02-28 74.615564
2011-03-31 73.535187
2011-04-30 72.491390
2012-01-31 72.162768
2012-02-29 61.637952
2012-03-31 59.445419
2012-04-30 25.685615
2012-05-31 8.047693
2012-06-30 58.341200
...
9981 2016-12-31 51.011261
2018-05-31 54.462832
2018-06-30 57.126250
2018-07-31 54.695835
2018-08-31 63.758145
2018-09-30 63.255583
2018-10-31 62.069697
2018-11-30 62.795650
2018-12-31 63.045329
2019-01-31 60.276990
2019-02-28 56.666379
2019-03-31 57.903213
2019-04-30 57.558973
2019-05-31 52.260287
我试图做:
df2 = df.sort_index(by='Score', ascending=False)
但是它并没有让我得到我想要的东西。 你能帮忙吗?我对多层数据框很陌生。 非常感谢!
答案 0 :(得分:2)
您应该将索引级别交换为第一个月,然后按时间戳升序和分数降序进行排序:
df.index = df.index.swaplevel()
df.sort_values(['timestamp', 'Score'], ascending=[True, False], inplace=True)
由于您的样本值无法得出有趣的结果,因为只有一家公司的得分值一个月。
要提取一个月的值,可以使用df.xs(month_value, level=0)
将其降低到多索引中的一级,或者使用df.xs(month_value, level=0, drop_level=False)
将其保留下来。