【问题标题】:pandas won't rename multiindex column name熊猫不会重命名多索引列名
【发布时间】:2020-09-04 20:12:33
【问题描述】:

我刚刚花了几个小时试图让它发挥作用,我开始认为我想要不可能的事情,尽管我很确定它可以完成。我有一个熊猫数据框,它有一个多索引标题(excel 电子表格,3 行标题)。我肯定在看它,所以我知道它存在,但是当我尝试根据官方文档重命名列时,我被告知找不到列名。

表格如下所示:

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

这个错误很有趣,因为它告诉我它找不到“测试”列(它实际上是告诉我它找不到它刚刚命名的列......)。我做错了什么??

谢谢大家!

【问题讨论】:

  • 你能打印 df.columns[0][0] 吗?它会给你“测试”吗?
  • 是的,打印 df.columns[0][0] 返回我要更改的列名。

标签: python pandas dataframe rename multi-index


【解决方案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)

【讨论】:

  • 如何在不手动输入列名的情况下实现这一点?我得到了 20 多列,而不是示例中的 3 列(尽管它们的格式相同)。
  • 它们都是完全不同的名称,因此我只需要重命名其中一个。任何方式我都可以复制现有的列名列表,但在此过程中替换其中一个?谢谢
  • @Chris 将理解改为['Boom' if x == 'Test' else x for...]
【解决方案2】:

我刚刚从函数中删除了 errors='raise' 并且它起作用了。熊猫的工作方式没有逻辑,但这似乎已经成功了。不确定某些东西是如何工作的,但如果你告诉它在需要时引发错误,它就会停止工作。无论如何,感谢所有人的尝试。如果有人能解释为什么会这样,出于我自己的理智,我将不胜感激!

【讨论】:

  • “pandas 的工作方式没有逻辑”,这是不必要的
  • 不是夸大其词或任何东西,但是如果没有指定应该引发错误,那么引发错误的逻辑在哪里会停止脚本以达到预期的结果?因为它确实有效,这意味着标签 IS 在索引中,但是如果设置了参数,pandas 会确定它不存在。
  • 该方法的文档字符串解释得很清楚。我认为您的问题来自使用“就地”。查看我的回答了解更多信息
【解决方案3】:

这种参数组合对我有用:

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

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 2019-07-28
    • 1970-01-01
    • 2021-12-07
    • 2016-09-15
    • 2020-03-24
    • 2019-11-01
    • 2019-08-06
    • 2021-08-15
    相关资源
    最近更新 更多