2017-09-25 72 views
3

我有以下數據框:大熊貓,重命名一個多指標列(數據的順序被改變)

{'e1.data_280': {0: 10, 1: 20, 2: 30}, 
'e1.data_603': {0: 7, 1: 8, 2: 9}, 
'e2.data_280': {0: 30, 1: 20, 2: 10}, 
'e2.data_603': {0: 8, 1: 9, 2: 1}} 

後:

df.columns = df.columns.str.split('.', expand=True) 

它看起來像:

enter image description here

現在我想擺脫短語data_

落後下劃線的三個數字:

cols = [item.split('_')[1] for item in df.columns.get_level_values(1)] 
cols 
['603', '280', '603', '280'] 

如果我取代舊的標籤:

df.columns.set_levels(cols, level=1, inplace=True) 

的數據被更改:

enter image description here

我看到cols比第1級多重索引的名稱多:

MultiIndex(levels=[['e1', 'e2'], ['data_280', 'data_603']], 
      labels=[[0, 0, 1, 1], [1, 0, 1, 0]]) 

但是,如何重命名數據框中第一級多索引列?

編輯:一種解決方法

df.unstack().reset_index() 

與重命名列和分裂的列值一起工作:

+1

我在運行代碼時似乎得到了你想要的結果。 – GiantsLoveDeathMetal

+0

但是,當我通過'inplace = True'時遇到錯誤,但是所需的df是我沒有它的時候得到的。 – GiantsLoveDeathMetal

+0

@GiantsLoveDeathMetal你運行的是什麼熊貓版本? – Moritz

回答

3

設置

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

選項1
最簡單的事情會一直以包括在你的第一次分裂。

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

df.columns = df.columns.str.split('.data_', expand=True) 

df 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

選項2
的事實後,你可以做

df.rename(columns=lambda x: x.replace('data_', '')) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

你甚至可以傳遞一個level縮小rename範圍。這確保我們不會在level=0列對象上執行replace

df.rename(columns=lambda x: x.replace('data_', ''), level=1) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 
0

您可以使用cols = [item.split('_')[1] for item in df.columns.levels[1]];這將保持對齊。

+0

當我在創建'cols'時,按照相同的順序運行了嗎? – GiantsLoveDeathMetal

+0

我不這麼認爲,但如果0級的兩個值在1級有不同的子集,那麼你的方法就會失敗。 –