如何重命名 pandas 中的 MultiIndex 列?
例如,这是我希望能够做的:
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')
Run Code Online (Sandbox Code Playgroud)
但是,这没有任何效果,返回一个与原始列名相同的 DataFrame:
a b
1 2 1
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
我想得到:
d e f
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
(我用来errors='raise'确保正确引用列名称。)
当您没有 MultiIndex 时,这有效:
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')
Run Code Online (Sandbox Code Playgroud)
返回:
d e f
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
我对此进行了一些变体,例如使用 level 参数并使新名称具有相同的级别数,但没有运气。
还有其他相关问题,但它们往往侧重于解决一些更大的问题。我可以想办法获得解决更大问题所需的结果,但我故意不在这里问这个问题。这种方法rename似乎是最自然的,我想了解为什么它不起作用或者我做错了什么。如果我应该使用与我的问题相关的替代方案,或者证明它没有达到我认为应该做的效果的rename信息,他们将不胜感激。rename
最相似的问题在这里,但答案没有解决我的问题:在我的示例中指定单个级别的值是不够的,因为单个级别无法唯一地指定每一列,也set_levels无法解决各个列。
您可以首先使用to_flat_index展平索引:
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
columns=pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)]))
lookup = {('a', 1): 'd', ('a', 2): 'e', ('b', 1): 'f'}
# flatten index
df.columns = df.columns.to_flat_index()
# rename using lookup
result = df.rename(columns=lookup)
print(result)
Run Code Online (Sandbox Code Playgroud)
输出
d e f
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8553 次 |
| 最近记录: |