如何重命名MultiIndex列?

2024-04-24 09:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

如何重命名pandas中的多索引列?你知道吗

例如,我希望能够做到:

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  columns=pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)]))

df.rename(columns={('a', 1): 'd', ('a', 2): 'e', ('b', 1): 'f'}, errors='raise')

但是,这没有效果,返回的数据帧与原始数据帧具有相同的列名:

   a     b
   1  2  1
0  1  2  3
1  4  5  6
2  7  8  9

我想得到:

   d  e  f
0  1  2  3
1  4  5  6
2  7  8  9

(我使用errors='raise'来确保正确引用列名。)

当您没有多重索引时,此操作有效:

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  columns=['a1', 'a2', 'b1'])

df.rename(columns={'a1': 'd', 'a2': 'e', 'b1': 'f'}, errors='raise')

退货:

   d  e  f
0  1  2  3
1  4  5  6
2  7  8  9

我在这方面做了很多改动,例如使用level参数,让新名称具有相同的级别数,但是运气不好。你知道吗

还有其他相关的问题,但他们往往专注于解决一些更大的问题。我可以想办法得到我需要的结果来解决我更大的问题,但我故意不要求在这里。这种使用rename的方法似乎是最自然的,我想了解为什么它不起作用或者我做错了什么。如果有一个与我的问题相关的rename的替代方法,或者rename上的一些信息证明它没有做我认为应该做的事情,他们会非常感激。你知道吗

最相似的问题是here,但答案并没有解决我的问题:在我的示例中,指定单个级别的值是不够的,因为单个级别不能唯一地指定每个列,set_levels不能处理单个列。你知道吗


Tags: columns方法importa2dataframepandasdfa1
2条回答

我建议将列表理解与具有相同默认值的^{}一起使用x

d = {('a', 1): 'd', ('a', 2): 'e', ('b', 1): 'f'}

df.columns = [d.get(x, x) for x in df.columns]
print (df)
   d  e  f
0  1  2  3
1  4  5  6
2  7  8  9

因为如果用rename测试某个函数,它会分别处理每个列名:

测试

def f(x):
    print (x)

a
1
a
2
b
1

print (df.rename(columns = f))

可以先使用to_flat_index展平索引:

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  columns=pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)]))

lookup = {('a', 1): 'd', ('a', 2): 'e', ('b', 1): 'f'}

# flatten index
df.columns = df.columns.to_flat_index()

# rename using lookup
result = df.rename(columns=lookup)

print(result)

输出

   d  e  f
0  1  2  3
1  4  5  6
2  7  8  9

相关问题 更多 >