繁体   English   中英

如何重命名 MultiIndex 列?

[英]How to rename MultiIndex columns?

如何重命名 pandas 中的 MultiIndex 列?

例如,这是我希望能够做到的:

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')

但是,这没有任何效果,返回与原始列名相同的 DataFrame:

   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'来确保我正确引用了列名。)

这在您没有 MultiIndex 时有效:

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的信息证明它没有做我认为应该做的事情,他们将不胜感激。

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

您可以先使用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)

Output

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

我建议使用具有相同默认值xget列表理解:

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测试一些 function ,它会分别处理每个列名:

测试

def f(x):
    print (x)

a
1
a
2
b
1

print (df.rename(columns = f))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM