簡體   English   中英

MultiIndex 中的新級別 DataFrame 基於現有列級別值

[英]New level in MultiIndex DataFrame based on existing column level values

假設我有一個這樣的 DataFrame:

df = pd.DataFrame(data = [[1,2,3,4,5,6], [3,4,5,6,7,8]], 
                  columns = pd.MultiIndex.from_product([('A1', 'B1', 'A2'), (10,20)], names=['level_0','level_1']))

它是這樣的: DataFrame 圖片

我想在包含1的列中添加一個新級別,其中level_0值包含"1"2 ,其中 level_0 值包含"2" 所以,基本上:

  • 其中level_0 == "A1" --> new_level = 1
  • 其中level_0 == "B1" --> new_level = 1
  • 其中level_0 == "A2" --> new_level = 2

關於如何做的任何建議?

您可以使用正則表達式( (\d+)$ = 值的最后幾位)提取值,並使用 MultiIndex.from_arrays 重新處理MultiIndex.from_arrays

values = df.columns.get_level_values('level_0').str.extract('(\d+)$', expand=False)
# ['1', '1', '1', '1', '2', '2']

df.columns = pd.MultiIndex.from_arrays([*zip(*df.columns.to_list()), values],
                                       names=[*df.columns.names, 'level_2']
                                      )

注意。 這推廣到任何 XXX00 值

output:

level_0 A1    B1    A2   
level_1 10 20 10 20 10 20
level_2  1  1  1  1  2  2
0        1  2  3  4  5  6
1        3  4  5  6  7  8

使用 lsit 理解從第一級值中提取數字並通過 MultiIndex.from_tuples 創建新的MultiIndex.from_tuples

import re

df.columns = pd.MultiIndex.from_tuples([(re.findall(r'(\d+)$', x[0])[0], *x) 
                                         for x in df.columns.tolist()], 
                                       names=('new_level',*df.columns.names))
print (df)

new_level  1           2   
level_0   A1    B1    A2   
level_1   10 20 10 20 10 20
0          1  2  3  4  5  6
1          3  4  5  6  7  8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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