首页 > 解决方案 > 对熊猫多索引中每个级别 1 的值进行排序

问题描述

我有一个带有多索引的数据框,第一级是 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)

但这并没有让我得到我想要的。你能帮忙吗?我对多级数据框很陌生。非常感谢!

标签: pythonpandassortingdataframe

解决方案


您应该先将索引级别交换为月份,然后按时间戳升序和分数降序排序:

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)将保留它。


推荐阅读