如何在多级列(熊猫)中将一级索引转换为新级别

Posted

技术标签:

【中文标题】如何在多级列(熊猫)中将一级索引转换为新级别【英文标题】:How can I transform a level of index into new level in Multi level column (Pandas) 【发布时间】:2022-01-13 09:44:46 【问题描述】:

我有以下数据框 dfg(这是以前聚合的结果)。

                   F-1   F-2
dataset Model               
G       Baseline 0.971 0.967
        Version2 0.971 0.967
H       Baseline 0.780 0.762
        Version2 0.800 0.777
S       Baseline 0.401 0.320
        Version2 0.453 0.365
T       Baseline 0.881 0.825
        Version2 0.989 0.985

我想要的是获得我的数据框的以下组织:

        Baseline    Version2
dataset F-1   F-2   F-1   F-2
G       0.971 0.967 0.971 0.967
H       0.780 0.762 0.800 0.777
S       0.401 0.320 0.453 0.365
T       0.881 0.825 0.989 0.985

我尝试了几件事,但我认为最好的解决方案总是给我错误。我最“合乎逻辑”的解决方案是:

重置索引(将“模型”提取到列中); 从元组创建多级列; 将列更改为多级列。

像这样:

dfg.reset_index(inplace=True, level=['Model']
new_cols = [('Baseline', 'F-1'), ('Baseline', 'F-2'), ('Version2', 'F-1'), ('Version2', 'F-2')]
multi_cols = pd.MultiIndex.from_tuples(new_cols, names=('Model', 'Measure'))

但我收到以下错误:

ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements

我知道这是相当原始的,但我找不到任何可以解释如何从现有数据框构建多级列的来源。

【问题讨论】:

【参考方案1】:

使用DataFrame.stackSeries.unstack,最后一个干净的列名称由DataFrame.rename_axis

#last previous, last levels
df = df.stack().unstack([-2,-1]).rename_axis((None, None), axis=1)
#or second and third levels
#df = df.stack().unstack([1,2]).rename_axis((None, None), axis=1)
print (df)
        Baseline        Version2       
             F-1    F-2      F-1    F-2
dataset                                
G          0.971  0.967    0.971  0.967
H          0.780  0.762    0.800  0.777
S          0.401  0.320    0.453  0.365
T          0.881  0.825    0.989  0.985

【讨论】:

谢谢!我怎么能“擦除”“模型”? @MrT77 - 答案已编辑。【参考方案2】:
df.stack().unstack(0).transpose()

【讨论】:

以上是关于如何在多级列(熊猫)中将一级索引转换为新级别的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中将列转换为一个日期时间列?

将多级索引的第一级旋转为多级列的第一级

如何将多索引列转换为熊猫数据框的单索引列?

如何删除熊猫数据透视表中的多级索引

在熊猫中将索引转换为日期时间

word多级列表怎么设置