簡體   English   中英

如何重命名 MultiIndex 列?

[英]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

我建議使用具有相同默認值xget列表理解:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM