pandas 不会重命名多索引列名
pandas won't rename multiindex column name
我刚刚花了几个小时试图让它工作,我开始认为我想要不可能的事情,尽管我很确定它可以完成。我有一个 pandas 数据框,它有一个多索引 header(excel 电子表格,3 行 header)。我肯定在看它,所以我知道它存在,但是当我尝试根据官方文档重命名列时,我被告知找不到列名。
table 看起来像这样:
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 是 level 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" 列(它实际上是在告诉我它找不到它刚刚命名的列...)。我做错了什么??
谢谢大家!
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)
我刚刚从函数中删除了 errors='raise' 并且它起作用了。 pandas 的工作方式没有逻辑,但这似乎已经成功了。不确定某些东西是如何工作的,但如果你告诉它在需要时引发错误,它就会停止工作。无论如何,谢谢大家的尝试。如果有人能解释为什么会这样,为了我自己的理智,我将不胜感激!
这个参数组合对我有用:
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')
哪个return一个新数据框:
col1 Boom!
col2 a
col3 x
id1 id2
A X 1
B Y 2
C Z 3
我刚刚花了几个小时试图让它工作,我开始认为我想要不可能的事情,尽管我很确定它可以完成。我有一个 pandas 数据框,它有一个多索引 header(excel 电子表格,3 行 header)。我肯定在看它,所以我知道它存在,但是当我尝试根据官方文档重命名列时,我被告知找不到列名。
table 看起来像这样:
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 是 level 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" 列(它实际上是在告诉我它找不到它刚刚命名的列...)。我做错了什么??
谢谢大家!
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)
我刚刚从函数中删除了 errors='raise' 并且它起作用了。 pandas 的工作方式没有逻辑,但这似乎已经成功了。不确定某些东西是如何工作的,但如果你告诉它在需要时引发错误,它就会停止工作。无论如何,谢谢大家的尝试。如果有人能解释为什么会这样,为了我自己的理智,我将不胜感激!
这个参数组合对我有用:
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')
哪个return一个新数据框:
col1 Boom!
col2 a
col3 x
id1 id2
A X 1
B Y 2
C Z 3