Pandas 创建多索引数据帧时如何合并常用索引

Pandas 创建多索引数据帧时如何合并常用索引,pandas,dataframe,Pandas,Dataframe,我有一个如下所示的数据帧: Method Dataset foo bar 0 A1 B1 10 20 1 A1 B2 10 20 2 A1 B2 10 20 3 A2 B1 10 20 4 A3 B1 10 20 5 A1 B1 10 20 6 A2 B2 10 20 7 A3 B2 1

我有一个如下所示的数据帧:

  Method Dataset  foo  bar
0     A1      B1   10   20
1     A1      B2   10   20
2     A1      B2   10   20
3     A2      B1   10   20
4     A3      B1   10   20
5     A1      B1   10   20
6     A2      B2   10   20
7     A3      B2   10   20
我想使用
方法
数据集
列将其转换为多索引数据帧。所以我试着做:

df.set_index(["Method", "Dataset"], inplace=True)
df.sort_index(inplace=True)
其中:

Method Dataset          
A1     B1        10   20
       B1        10   20
       B2        10   20
       B2        10   20
A2     B1        10   20
       B2        10   20
A3     B1        10   20
       B2        10   20
这几乎就是我想要的,但我希望看到
数据集
索引中的公共值也合并到一个值下,即类似于
方法
索引:

                foo  bar
Method Dataset         
A1     B1       10   20
                10   20
       B2       10   20
                10   20
A2     B1       10   20
       B2       10   20
A3     B1       10   20
       B2       10   20
我怎样才能做到这一点


(这可能对如何使用数据帧没有太大影响,但我正在尝试使用对这些内容敏感的
to_latex()
方法)

我建议您在将数据帧写入_latex之前,在最后完成此操作,否则您可能会遇到数据处理问题

我们将使最后一级中的重复项成为空字符串,并重建整个多索引

import pandas as pd
import numpy as np

df.index = pd.MultiIndex.from_arrays([
             df.index.get_level_values('Method'),
             np.where(df.index.duplicated(), '', df.index.get_level_values('Dataset'))
            ], names=['Method', 'Dataset'])


如果您想让它对任何级别(甚至只是一个简单的索引)更灵活,我们可以使用此函数,它将在最后一个级别中替换:

def white_out_index(idx):
    """idx : pd.MultiIndex or pd.Index"""
    i0 = [idx.get_level_values(i) for i in range(idx.nlevels-1)]
    i0.append(np.where(idx.duplicated(), '', idx.get_level_values(-1)))

    return pd.MultiIndex.from_arrays(i0, names=idx.names)


df.index = white_out_index(df.index)
def white_out_index(idx):
    """idx : pd.MultiIndex or pd.Index"""
    i0 = [idx.get_level_values(i) for i in range(idx.nlevels-1)]
    i0.append(np.where(idx.duplicated(), '', idx.get_level_values(-1)))

    return pd.MultiIndex.from_arrays(i0, names=idx.names)


df.index = white_out_index(df.index)