【发布时间】:2019-10-29 19:54:45
【问题描述】:
如何在 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
我已经搞砸了这方面的变化,例如使用级别参数并让新名称具有相同数量的级别但没有运气。
还有其他相关的问题,但他们倾向于专注于解决一些更大的问题。我可以想办法获得解决更大问题所需的结果,但我故意不在这里问这个问题。 rename 的这种方法似乎是最自然的,我想了解它为什么不起作用或我做错了什么。如果我应该使用与我的问题相关的rename 的替代品,或者rename 上的信息证明它没有按照我的想法做,他们将不胜感激。
最相似的问题是here,但答案并没有解决我的问题:在我的示例中,指定单个级别的值是不够的,因为单个级别无法唯一指定每一列,set_levels 无法解决个别列。
【问题讨论】:
-
df.columns = ['d','e','f'] -
@splash58,问题在于它依赖于可能不知道的列的顺序。