pandas无法重命名多重索引列名

3 投票
3 回答
942 浏览
提问于 2025-06-18 04:08

我刚花了好几个小时想让这个工作正常,现在开始觉得我可能在追求不可能的事情,不过我很确定这是可以做到的。我有一个 pandas 数据框,它的表头是多重索引(就像 Excel 表格,有三行表头)。我确实在看这个数据框,所以我知道它存在,但当我试着按照官方文档重命名一个列时,却被告知找不到这个列名。

这个表格看起来是这样的:

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

我只是想把“Test”改成“Boom”,比如说。Test 是第一层的列名中的第一个值,但它就是不管用。我用了下面这些方法:

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

问题是,即使我硬编码列名和层级,它还是不行!这应该能解决问题,因为在我其他的脚本中(有两层,而不是三层)是可以的:

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

这个错误挺搞笑的,因为它告诉我找不到“Test”这一列(它明明刚刚说过这个列名)。我到底哪里出错了??

谢谢大家!

相关问题:

  • 暂无相关问题
暂无标签

3 个回答

0

我刚把函数里的errors='raise'去掉了,然后它就正常工作了。其实pandas的工作方式有点奇怪,但这样做似乎解决了问题。我不太明白为什么要设置成如果有错误就抛出错误的情况下,它反而不工作。谢谢大家的帮助。如果有人能解释一下为什么会这样,我会很感激,这样我心里也能踏实点!

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

撰写回答