Python pandas:如何在pandas Multiindex中折叠特定的索引级别,同时保留索引的其他值?

w80xi6nr  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(120)

我有以下Multiindex pandas dataframe:

data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
index = pd.MultiIndex.from_tuples([('X', 'a', 'I'), ('X', 'b', 'II'), ('Y', 'a', 'III')], names=['Level1', 'Level2', 'Level3'])
df = pd.DataFrame(data, index=index)

                      A  B
Level1 Level2 Level3      
X      a      I       1  4
       b      II      2  5
Y      a      III     3  6

我希望看到以下结果,用'-'连接Level 1和Level2,同时保留Level 3的值:

A  B
CombinedLevel Level3      
X - a         I        1  4
X - b         II       2  5
Y - a         III      3  6

我已经尝试过使用set_index()和lambda函数的各种解决方案,但它们似乎要么将整个索引重置为最终Level 1中的值,要么抛出KeyErrors。我已经考虑过将索引解栈,将它们跨列连接起来,然后再次堆叠它们,但我沿着“KeyError:“请求的级别(CombinedLevel)与索引名称”不匹配。

e3bfsja2

e3bfsja21#

您始终可以转换to_frame以使操作更容易,然后使用MultiIndex.from_frame转换回来:

tmp = df.index.to_frame()
tmp['CombinedLevel'] = tmp['Level1'] + ' - ' + tmp['Level2']

df.index = pd.MultiIndex.from_frame(tmp[['CombinedLevel', 'Level3']])

或者使用get_level_valuesfrom_arrays

df.index = pd.MultiIndex.from_arrays([df.index.get_level_values('Level1') + ' - ' + df.index.get_level_values('Level2'),
                                      df.index.get_level_values('Level3')], names=['CombinedLevel', 'Level3'])

或者:

df.index = pd.MultiIndex.from_arrays([(df.index.get_level_values('Level1')
                                       + ' - ' +
                                       df.index.get_level_values('Level2')).rename('CombinedLevel'),
                                      df.index.get_level_values('Level3')])

输出量:

A  B
CombinedLevel Level3      
X - a         I       1  4
X - b         II      2  5
Y - a         III     3  6
lf5gs5x2

lf5gs5x22#

请在计算df后尝试添加此脚本。

df = (df.reset_index()
            .assign(CombinedLevel=lambda x: x['Level1'] + ' - ' + x['Level2'])
            .set_index(['CombinedLevel', 'Level3'])
            .drop(columns=['Level1', 'Level2']))
rdrgkggo

rdrgkggo3#

使用MultiIndex.from_tuplesf-strings的列表比较:

df.index = pd.MultiIndex.from_tuples([(f'{a} - {b}', c) for a, b, c in df.index], 
                                     names=['CombinedLevel','Level3'])
print (df)
                      A  B
CombinedLevel Level3      
X - a         I       1  4
X - b         II      2  5
Y - a         III     3  6

或者将MultiIndex.get_level_valuesMultiIndex.from_arrays一起使用:

Level1 = df.index.get_level_values('Level1')
Level2 = df.index.get_level_values('Level2')
Level3 = df.index.get_level_values('Level3')

df.index = pd.MultiIndex.from_arrays([Level1 + ' - ' + Level2, Level3], 
                                      names=['CombinedLevel','Level3'])
Level1 = df.index.get_level_values('Level1')
Level2 = df.index.get_level_values('Level2')
Level3 = df.index.get_level_values('Level3')

df.index = [Level1 + ' - ' + Level2, Level3]
df.index.names = ['CombinedLevel','Level3']

print (df)
                      A  B
CombinedLevel Level3      
X - a         I       1  4
X - b         II      2  5
Y - a         III     3  6

相关问题