【问题标题】:Sort pandas DataFrame with MultiIndex according to column value根据列值对带有 MultiIndex 的 pandas DataFrame 进行排序
【发布时间】:2017-09-14 06:57:25
【问题描述】:

在控制台中打印后,我有一个带有 MultiIndex 的 DataFrame:

值 indA indB 场景 ID 组 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 4A -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 安 -32.0 1.0 1.0 3 安 -91.0 2.0 2.0 4 A -17.0 2.0 2.0

我在我的初始数据集上使用了groupbysum 函数后得到了它。

我想保持相同的格式,但按照value 列排序。我已经努力使用排序功能来做到这一点,但我认为 MultiIndex 的第一个索引(用于日期)没有名称是一个问题。

基本上,输出应该是这样的:

值 indA indB 场景 ID 组 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 4A -270.0 2.0 2.0 2015-04-14 1 C -60.0 1.0 1.0 A -56.0 1.0 1.0 B -1.0 0.0 1.0 2 安 -32.0 1.0 1.0 3 安 -91.0 2.0 2.0 4 A -17.0 2.0 2.0

有人能告诉我吗?

提前致谢。

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    你可以使用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
    

    另一种解决方案 - 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 组?
    • 嗯,可以使用df = df.groupby(level=[0,1]).head(2),但所有组(我不确定是否需要)
    • 或者可能需要df = df.groupby(level=0)['value'].nsmallest(2)
    猜你喜欢
    • 2016-12-01
    • 2018-08-22
    • 2021-03-21
    • 2021-02-10
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多