【问题标题】:How to create multi level index from multiindex column dataframe如何从多索引列数据框创建多级索引
【发布时间】:2023-03-23 07:35:02
【问题描述】:

主要目标是从现有的df 中设置多索引行。

假设我们有如下多级列

        level1            
        level2            
      sub_name   A   B   C
ONE         TT  11  12  13
TWO         TT  21  22  23
THREE       TT  31  32  33

然后,预期的输出 (1)

           level1        
           level2        
           A   B   C
TT ONE       11  12  13
   TWO       21  22  23
   THREE     31  32  33

我觉得这可以通过group 或直接使用set_index 来实现,如下所示

df = df.groupby((slice ( None ), slice ( None ),'sub_name'),as_index = False)

df=df.set_index([(slice ( None ), slice ( None ),'sub_name')])

但是,这不起作用。

使得第一种方法返回错误

TypeError: unhashable type: 'slice'

第二种方法

TypeError:参数“keys”可能是列键,一维 数组,或仅包含有效列键和一维的列表 数组.. 接收到

类型的列

我想知道实现预期目标的正确方法是什么。

重现上述错误的完整代码

import pandas as pd

df = pd.DataFrame ( {'A': [11, 21, 31],
                     'B': [12, 22, 32],
                     'C': [13, 23, 33]},
                    index=['ONE', 'TWO', 'THREE'] )

df.columns = pd.MultiIndex.from_product ( [['level1'], ['level2'], df.columns] )

df2 = pd.DataFrame ( ['TT'] * len ( df ), index=df.index,
                     columns=pd.MultiIndex.from_product ( [df.columns.levels [0],
                                                           df.columns.levels [1],
                                                           ['sub_name']] ) ) 
# Im just curios whether there is simpler way of creating constant column like this


df = pd.concat ( [df2,df ], axis=1 )

# df = df.groupby((slice ( None ), slice ( None ),'sub_name'),as_index = False)

# df=df.set_index([(slice ( None ), slice ( None ),'sub_name')])

contributor 的支持下。

额外的问题是是否可以在TT 之上添加另一个级别而无需创建常量列(即df2

               level1
               level2
               A   B   C
main_level TT  ONE     11  12  13
               TWO     21  22  23
               THREE   31  32  33

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    你可以试试set_index()+xs()+swaplevel()+drop():

    df=(df.set_index(df.xs('sub_name',axis=1,level=2).values.squeeze(),append=True)
          .swaplevel(0).drop('sub_name',axis=1,level=2))
    

    输出:

                level1
                level2
                A   B   C
    TT  ONE     11  12  13
        TWO     21  22  23
        THREE   31  32  33
    

    注意:您也可以使用df.loc[:,(slice(None),slice(None),'sub_name')] 代替df.xs('sub_name',axis=1,level=2)

    更新:

    你可以试试pd.MultiIndex.from_product():

    df.index=pd.MultiIndex.from_product([['main_level'],['TT'],df.index.unique()])
    

    输出:

                            level1
                            level2
                            A   B   C
    main_level TT   ONE     11  12  13
                    TWO     21  22  23
                    THREE   31  32  33
    

    【讨论】:

    • 谢谢@Anurag。顺便说一句,我只是好奇是否可以在TT 之上创建另一个级别('main_level)而不创建constant column(即df2)。例如,预期的输出将是: level1 level2 A B C main_level TT ONE 11 12 13 TWO 21 22 23 THREE 31 32 33
    • 抱歉,评论的格式不正确。但我不确定这种好奇心是否值得发新帖。
    • @balandongiv 你可以添加有问题的
    • 重命名索引列:df=df.rename_axis ( index=['main_level', None] ) # 编辑命名
    • @balandongiv 你不需要运行set_index() 2 次..更新答案..请看一下:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2017-05-01
    • 2016-01-10
    • 2018-10-24
    • 1970-01-01
    • 2017-11-10
    • 2016-01-13
    相关资源
    最近更新 更多