使用 pandas 创建一个 multiIndex

Posted

技术标签:

【中文标题】使用 pandas 创建一个 multiIndex【英文标题】:Create a multiIndex with pandas 【发布时间】:2020-05-17 12:26:21 【问题描述】:

我有一个带有两个索引的数据框,如下所示:

Index1       Index2             200701     200702     200703      
alphas       Fourth Quartile    41.7421    41.1807     39.071           
             Third Quartile     74.1573    95.0195    90.6572          
             Second Quartile   -34.2001   -42.0068   -21.6236  
             First Quartile      39.293    37.3475    34.1704        
             All_Quartiles      37.6624    38.5957    38.0504        
betas        Fourth Quartile    18.1041    23.0865    33.7109       
             Third Quartile    -51.9743   -93.1191   -87.1772        
             Second Quartile    121.262    131.556    103.549        
             First Quartile     26.1859    28.5129    31.8663          
             All_Quartiles       24.511    23.1601    0.159067  

我需要新的索引,像这样:

New_index  Index1     Index 2            200701     200702     200703      
Sector     alphas     Fourth Quartile    41.7421    41.1807     39.071              
                      Third Quartile     74.1573    95.0195    90.6572         
                      Second Quartile   -34.2001   -42.0068   -21.6236      
                      First Quartile      39.293    37.3475    34.1704        
                      All_Quartiles      37.6624    38.5957    38.0504     
           betas      Fourth Quartile    18.1041    23.0865    33.7109       
                      Third Quartile    -51.9743   -93.1191   -87.1772          
                      Second Quartile    121.262    131.556    103.549            
                      First Quartile     26.1859    28.5129    31.8663          
                      All_Quartiles       24.511    23.1601    0.159067     

我有许多数据帧多索引属于不同的部门,我需要用一个循环合并每个数据帧。

【问题讨论】:

您真的需要为单个 DataFrame 执行此操作,还是仅在组合它们时添加 'New_index' 级别就足够了,这似乎是最自然的?如果是后者,您正在寻找 pd.concatkeys 参数。 不,我不能使用pd.concat 和参数keys 我需要使用df.append 但首先我需要创建新索引 【参考方案1】:

您可以手动重新创建整个 MultiIndex,但这需要大量的写作。我更喜欢 concatkeys 参数来添加额外的级别。 names 参数允许我们给它一个名字。

pd.concat([df], keys=['Sector'], names=['New_index']+df.index.names)

                                    200701    200702      200703
New_index Index1 Index2                                         
Sector    alphas Fourth Quartile   41.7421   41.1807   39.071000
                 Third Quartile    74.1573   95.0195   90.657200
                 Second Quartile  -34.2001  -42.0068  -21.623600
                 First Quartile    39.2930   37.3475   34.170400
                 All_Quartiles     37.6624   38.5957   38.050400
          betas  Fourth Quartile   18.1041   23.0865   33.710900
                 Third Quartile   -51.9743  -93.1191  -87.177200
                 Second Quartile  121.2620  131.5560  103.549000
                 First Quartile    26.1859   28.5129   31.866300
                 All_Quartiles     24.5110   23.1601    0.159067

这里将与手动重新创建 MultiIndex 相同。

arrays = []

arrays.append(pd.Index(['Sector']*len(df), name='New_Index')) # 0th level sector

# Add all existing levels
for i in range(df.index.nlevels):
    arrays.append(df.index.get_level_values(i))

new_idx = pd.MultiIndex.from_arrays(arrays)

df.index = new_idx

上面基本上是DataFrame.set_index(append=True) 的内部结构,所以你可以用它来清理一下。

df['New_index'] = 'Sector'                  # New column
df = df.set_index('New_index', append=True) # Bring it to index
df = df.reorder_levels([2, 0, 1])           # Move it to the front

【讨论】:

或者将方法链在一起一步完成....df.assign(New_index='Sector').set_index('New_index', append=True).reorder_levels([2,0,1]) 感谢您的帮助,我的目的达到了。

以上是关于使用 pandas 创建一个 multiIndex的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 中的 MultiIndex 创建数据框

使用元组键从字典创建 MultiIndex pandas DataFrame

从字典列表创建 Pandas MultiIndex 的最佳方法是啥?

带有 MultiIndex Pandas 面板的切片函数

pandas分层索引(层级索引MultiIndex)的创建取值切片统计计算以及普通索引和层级索引的转换方法

带有 MultiIndexing 的 Pandas 数据框中的 Groupby