熊猫不会重命名多索引列名称

时间:2020-05-18 21:51:41

标签: python pandas dataframe rename multi-index

我花了几个小时试图使它工作,我开始认为我想要不可能的事,尽管我很确定它可以做到。我有一个带有multiindex标头(excel电子表格,三行标头)的pandas数据框。我肯定在看它,所以我知道它存在,但是当我尝试根据官方文档重命名列时,被告知找不到列名。

该表如下所示:

Test              | Test1         | Test2
                  | abc   | xyz   | abc   | xyz
geo1    | geo2    | geo1  | geo2  | geo1  | geo2
------------------------------------------------
a       | x       | 1     | 0.5   | 1     | 0.5
b       | y       | 2     | 0.2   | 2     | 0.2
c       | z       | 3     | 0.4   | 3     | 0.3

例如,我只是想将“测试”更改为“动臂”。测试是级别0中列名称的第一个值,但它不起作用。我使用了其中之一:

df.rename(columns={df.columns[0][0]: 'Boom'}, inplace=True, errors='raise')
df.rename(columns={df.columns[0][0]: 'Boom'}, level=0, inplace=True, errors='raise')
df.rename(columns={df.columns.values[0][0]: 'Boom'}, inplace=True, errors='raise')

问题是,即使我对列名和级别进行了硬编码,它仍然无法正常工作!这应该可以解决问题,因为它可以在我的其他脚本(2个级别,而不是3个)中起作用:

df.rename(columns={'Test': 'Boom'}, level=0, inplace=True, errors='raise')

该错误很有趣,因为它告诉我找不到“ Test”列(实际上是告诉我找不到仅命名的列...)。我在做什么错??

谢谢大家!

3 个答案:

答案 0 :(得分:1)

df.columns.set_levels(['Boom1','Boom2','Boom3'],level=0,inplace=True)

如果您的列是Boom1,...,Boom1000,则首先创建一个名称列表,

ll = [f"Boom{i}" for i in range(1,1001)]
df.columns.set_levels(ll,level=0,inplace=True)

答案 1 :(得分:0)

我刚刚从函数中删除了error ='raise',它起作用了。熊猫的工作方式没有逻辑,但这似乎可以解决问题。不确定某件事情如何工作,但是如果您告诉它在需要时引发错误,它将停止工作。谢谢大家的尝试。如果有人可以解释为什么会这样,出于我的理智,我将不胜感激!

答案 2 :(得分:0)

这种参数组合对我有用:

index = pandas.MultiIndex.from_tuples([('A', 'X'), ('B', 'Y'), ('C', 'Z')], names=['id1', 'id2'])
columns = pandas.MultiIndex.from_tuples([('Test1', 'a', 'x')], names=['col1', 'col2', 'col3'])

df = pandas.DataFrame(
    data = [1, 2, 3],
    index=index,
    columns=columns
)

df.rename(columns={'Test1': 'Boom!'}, level='col1')

这将返回一个新的数据帧:

col1    Boom!
col2        a
col3        x
id1 id2      
A   X       1
B   Y       2
C   Z       3