【问题标题】:Custom Aggregation Across Parallel Hierarchy Levels in a Multi-Index多索引中跨并行层次结构级别的自定义聚合
【发布时间】:2023-01-30 22:03:58
【问题描述】:

我有一个分层组织的数据框。考虑一下:

                                         baseval
indexlevel0 indexlevel1 indexlevel2         
L0-0        L1-0        L2-0               1
                        L2-1               1
                        L2-2              20
            L1-1        L2-0               2
                        L2-1               2
                        L2-2              10

我需要做的是创建一个新的数据框,通过将相应的 (indexlevel2) 替换为单个值来折叠中间级别 (indexlevel1),该值是曾经包含在 indexlevel1 中的两个级别中的最小值。

可能更容易说明我的意思 - 上述示例的解决方案是(即保留索引级别 0 和 2,以及每个索引级别 2 的最小基值):

                         minbylevel
indexlevel0 indexlevel2            
L0-0        L2-0                  1
            L2-1                  1
            L2-2                 10

我什至不知道从哪里开始。所有聚合等的例子都是自下而上的。

这是一些用于创建起点数据框的测试代码。

import pandas as pd
from io import StringIO

testdata = """
indexlevel0,indexlevel1,indexlevel2,baseval
L0-0,L1-0,L2-0,1
L0-0,L1-0,L2-1,1
L0-0,L1-0,L2-2,20
L0-0,L1-1,L2-0,2
L0-0,L1-1,L2-1,2
L0-0,L1-1,L2-2,10
"""
testinput = StringIO(testdata)

data_df = pd.read_csv(testinput, index_col=[0,1,2], header=[0]).sort_index()
print(data_df)

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    利用:

    df = data_df.loc[data_df.groupby(level=[2])['baseval'].idxmin()].droplevel(1)
    print (df)
                             baseval
    indexlevel0 indexlevel2         
    L0-0        L2-0               1
                L2-1               1
                L2-2              10
    

    【讨论】:

      【解决方案2】:

      哦......在发布后我才恍然大悟,我可以通过交换级别来“自下而上”地解决问题。

      from pathlib import Path
      import pandas as pd
      from io import StringIO
      
      testdata = """
      indexlevel0,indexlevel1,indexlevel2,baseval
      L0-0,L1-0,L2-0,1
      L0-0,L1-0,L2-1,1
      L0-0,L1-0,L2-2,20
      L0-0,L1-1,L2-0,2
      L0-0,L1-1,L2-1,2
      L0-0,L1-1,L2-2,10
      """
      testinput = StringIO(testdata)
      
      data_df = pd.read_csv(testinput, index_col=[0,1,2], header=[0]).sort_index()
      print(data_df)
      
      s = data_df.swaplevel(1).sort_index().groupby(level=[0,1]).min()
      print(s)
      

      输出

                                           baseval
      indexlevel0 indexlevel1 indexlevel2         
      L0-0        L1-0        L2-0               1
                              L2-1               1
                              L2-2              20
                  L1-1        L2-0               2
                              L2-1               2
                              L2-2              10
                               baseval
      indexlevel0 indexlevel2         
      L0-0        L2-0               1
                  L2-1               1
                  L2-2              10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-25
        • 2021-02-18
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多