[英]How to rename MultiIndex columns?
如何重命名 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')
但是,這沒有任何效果,返回與原始列名相同的 DataFrame:
a b
1 2 1
0 1 2 3
1 4 5 6
2 7 8 9
我想得到:
d e f
0 1 2 3
1 4 5 6
2 7 8 9
(我使用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')
回報:
d e f
0 1 2 3
1 4 5 6
2 7 8 9
我已經搞砸了這方面的變化,例如使用 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)
Output
d e f
0 1 2 3
1 4 5 6
2 7 8 9
我建議使用具有相同默認值x
的get
列表理解:
d = {('a', 1): 'd', ('a', 2): 'e', ('b', 1): 'f'}
df.columns = [d.get(x, x) for x in df.columns]
print (df)
d e f
0 1 2 3
1 4 5 6
2 7 8 9
因為如果使用rename
測試一些 function ,它會分別處理每個列名:
測試:
def f(x):
print (x)
a
1
a
2
b
1
print (df.rename(columns = f))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.