根据列值对具有多重索引的pandas DataFrame进行排序

11

我有一个带有MultiIndex的DataFrame,打印在控制台上看起来像这样:

                             value  indA  indB
           scenarioId group                        
2015-04-13    1       A           -54.0   1.0   1.0
                      B          -160.0   1.0   1.0
                      C           -15.0   0.0   1.0
              2       A           -83.0   1.0   1.0
              3       A           -80.0   2.0   2.0
              4       A          -270.0   2.0   2.0
2015-04-14    1       A           -56.0   1.0   1.0
                      B            -1.0   1.0   1.0
                      C           -60.0   0.0   1.0
              2       A           -32.0   1.0   1.0
              3       A           -91.0   2.0   2.0
              4       A           -17.0   2.0   2.0

我使用groupbysum函数对初始数据集进行操作得到了它。

我想保持相同的格式,但根据value列对其进行排序。我尝试使用排序函数来做到这一点,但我认为MultiIndex的第一个索引(用于日期)没有名称是个问题。

基本上,输出应该像这样:

                             value  indA  indB
           scenarioId group                        
2015-04-13   1        B          -160.0   1.0   1.0
                      A           -54.0   1.0   1.0
                      C           -15.0   0.0   1.0
             2        A           -83.0   1.0   1.0
请问有人可以为我解释一下这个吗?
谢谢。

预先感谢。

1个回答

7

您可以使用 sort_values + sort_index 来排序:

print (df.sort_values('value').sort_index(level=[0,1], sort_remaining=False))
                             value  indA  indB
           scenarioId group                   
2015-04-13 1          B     -160.0   1.0   1.0
                      A      -54.0   1.0   1.0
                      C      -15.0   0.0   1.0
           2          A      -83.0   1.0   1.0
           3          A      -80.0   2.0   2.0
           4          A     -270.0   2.0   2.0
2015-04-14 1          C      -60.0   0.0   1.0
                      A      -56.0   1.0   1.0
                      B       -1.0   1.0   1.0
           2          A      -32.0   1.0   1.0
           3          A      -91.0   2.0   2.0
           4          A      -17.0   2.0   2.0

另一个解决方案是使用具有reset_index和set_index的sort_values方法: sort_valuesreset_indexset_index
df = df.reset_index()
       .sort_values(['level_0','scenarioId','value'])
       .set_index(['level_0','scenarioId','group'])
print (df)
                             value  indA  indB
level_0    scenarioId group                   
2015-04-13 1          B     -160.0   1.0   1.0
                      A      -54.0   1.0   1.0
                      C      -15.0   0.0   1.0
           2          A      -83.0   1.0   1.0
           3          A      -80.0   2.0   2.0
           4          A     -270.0   2.0   2.0
2015-04-14 1          C      -60.0   0.0   1.0
                      A      -56.0   1.0   1.0
                      B       -1.0   1.0   1.0
           2          A      -32.0   1.0   1.0
           3          A      -91.0   2.0   2.0
           4          A      -17.0   2.0   2.0

也许有一个与同一主题相关的快速问题:是否有一种简单的方法只保留数据框中最小的2个值?即对于情景1,仅在2015年4月13日保留B组和A组,在2015年4月14日保留C组和A组? - JejeBelfort
2
嗯,可以使用 df = df.groupby(level=[0,1]).head(2),但是所有的组都会被包括进去(我不确定是否需要)。 - jezrael
1
或者可能需要 df = df.groupby(level=0)['value'].nsmallest(2) - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接