Pandas-向多索引添加列级别

问题描述 投票:0回答:1

我想根据值列表在数据框中添加一个子级别(L4):

x = [0.01, 0.01, 0.01, 0.02, 0.02, 0.02]

df.columns向我返回此:

MultiIndex(levels=[['Foo', 'Bar'], ['A', 'B', 'C'], ['a']],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2], [0, 0, 0, 0, 0, 0]],
           names=['L1', 'L2', 'L3'])

到目前为止,我已经尝试过:

df = pd.concat([df], keys=x, names=['L4'], axis=1).swaplevel(i='L4', j='L1', axis=1).swaplevel(i='L4', j='L2', axis=1).swaplevel(i='L4', j='L3', axis=1)

但是它没有给出好的值,它重复list_levels [0](0.01)。

您对我该怎么做有任何想法吗?

谢谢

python pandas multi-index
1个回答
0
投票

不确定是否有一些简洁的方法,尤其是对于列。 set_index允许您为行索引追加,但under the hood只是重新创建整个索引,因此我们可以执行以下操作:

idx = pd.MultiIndex(levels=[['Foo', 'Bar'], ['A', 'B', 'C'], ['a']],
                    codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2], [0, 0, 0, 0, 0, 0]],
                    names=['L1', 'L2', 'L3'])
x = [0.01, 0.01, 0.01, 0.02, 0.02, 0.02]

arrays = []
for i in range(idx.nlevels):
    arrays.append(idx._get_level_values(i))

arrays.append(pd.Index(x, name='L4'))  # Add the new level

new_idx = pd.MultiIndex.from_arrays(arrays)
#MultiIndex([('Foo', 'A', 'a', 0.01),
#            ('Foo', 'B', 'a', 0.01),
#            ('Foo', 'C', 'a', 0.01),
#            ('Bar', 'A', 'a', 0.02),
#            ('Bar', 'B', 'a', 0.02),
#            ('Bar', 'C', 'a', 0.02)],
#           names=['L1', 'L2', 'L3', 'L4'])
© www.soinside.com 2019 - 2024. All rights reserved.