Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重命名多索引列?_Python_Pandas - Fatal编程技术网

Python 如何重命名多索引列?

Python 如何重命名多索引列?,python,pandas,Python,Pandas,如何在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

如何在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
上的一些信息证明它没有达到我认为应该达到的效果,我将不胜感激


最相似的问题是,但答案没有解决我的问题:在我的示例中,指定单个级别的值是不够的,因为单个级别无法唯一地指定每一列,
set\u levels
无法处理单个列。

您可以使用以下方法首先展平索引:

输出

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

我建议使用具有相同默认值的列表理解
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
因为如果使用
重命名测试某个函数,它将分别处理每个列名:

测试

def f(x):
    print (x)

a
1
a
2
b
1

print (df.rename(columns = f))

df.columns=['d','e','f']
@splash58,问题是它依赖于可能未知的列顺序。这是一种很好的方法,我没有点击列名可以是tuple。它避免了我在其他问题上看到的其他类似解决方案的字符串操作。它只增加了一个额外的步骤(调用
到\u flat\u index
)。我只是想等待,看看是否有人能解释为什么重命名不能像我预期的那样工作。感谢
get
的建议,我不确定哪一个更可读-这是下面的方法还是
to_flat\u index
方法。假设重命名以与dict相同的方式处理函数映射器是否安全?我不确定如果使用
errors='raise'
@rich3948756410927-
rename
multi-index
一起工作时,如果只需要重命名一些标量,我们是否应该得到一个错误,如果需要同时更改这两个标量,唯一的解决方案是展平。
def f(x):
    print (x)

a
1
a
2
b
1

print (df.rename(columns = f))