【问题标题】:How to rename MultiIndex columns?如何重命名 MultiIndex 列?
【发布时间】: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,问题在于它依赖于可能不知道的列的顺序。

标签: python pandas


【解决方案1】:

你可以先展平索引,使用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

【讨论】:

  • 这是一个不错的方法,它并没有让我知道列名可能是元组。它避免了我在其他问题上看到的其他类似解决方案的字符串操作。它只为我尝试做的事情增加了一个额外的步骤(调用to_flat_index)。我只是等待,看看是否有人能解释为什么重命名不能按我的预期工作。
【解决方案2】:

我建议使用具有相同默认值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测试某个函数,它会分别处理每个列名:

测试

def f(x):
    print (x)

a
1
a
2
b
1

print (df.rename(columns = f))

【讨论】:

  • 感谢get 的建议,我不确定哪个更具可读性——这个还是下面的to_flat_index 方法。假设重命名以与字典相同的方式处理函数映射器是否安全?我不确定在使用errors='raise' 时是否会出现错误。
猜你喜欢
  • 2019-02-24
  • 2017-05-04
  • 2018-06-19
  • 2019-08-06
  • 2020-05-10
  • 2022-06-14
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多