2016-08-15 101 views
0

我有一個數據幀,看起來像整蠱寬,在大熊貓長轉換多索引列

stock date   type1 type2 volume_A qtit_A volume_B qtit_B 
'ABC' '2013-01-01' 1  2  1000  5  2500  6 
'ABC' '2013-01-02' 1  3  4000  10  2500  0 

,我想如下重塑它:

stock date   type1 type2 volume qtit type 
'ABC' '2013-01-01' 1  2  1000  5 A  
'ABC' '2013-01-01' 1  2  2500  6 B 
'ABC' '2013-01-02' 1  3  4000  10 A 
'ABC' '2013-01-02' 1  3  2500  0 B 

在這裏你可以看到['volume_A','qtit_A','volume_B','qtit_B']列在['volume','qtit']分解與類型指標,以記住我們正在查看哪種類型的價格/價格。

我很努力在大熊貓是在做一個乾淨的方式(使用meltstack()例如)

任何想法? 謝謝!

回答

2

如果設置['date','stock','type1','type2']index,那麼你就可以在'_'分割剩餘的列標籤,從這些元組創建一個多指標,然後使用stackAB標籤遷入indexreset_index然後通過將索引級別移回到列中來產生期望的結果。

import pandas as pd 

df = pd.DataFrame({'date': ['2013-01-01', '2013-01-02'], 
'qtit_A': [5, 10], 
'qtit_B': [6, 0], 
'stock': ['ABC', 'ABC'], 
'type1': [1, 1], 
'type2': [2, 3], 
'volume_A': [1000, 4000], 
'volume_B': [2500, 2500]}) 

df = df.set_index(['date','stock','type1','type2']) 
df.columns = pd.MultiIndex.from_tuples([col.split('_', 1) for col in df.columns]) 
result = df.stack(level=1).reset_index() 
result = result.rename(columns={'level_4':'type'}) 
print(result) 

產量:

  date stock type1 type2 type qtit volume 
0 2013-01-01 ABC  1  2 A  5 1000 
1 2013-01-01 ABC  1  2 B  6 2500 
2 2013-01-02 ABC  1  3 A 10 4000 
3 2013-01-02 ABC  1  3 B  0 2500 
3
pd.lreshape(df.assign(type_A=['A']*len(df), type_B=['B']*len(df)), 
      {'volume': ['volume_A', 'volume_B'], 
      'qtit': ['qtit_A', 'qtit_B'], 
      'type': ['type_A', 'type_B']}) 
Out: 
      date stock type1 type2 qtit type volume 
0 '2013-01-01' 'ABC'  1  2  5 A 1000 
1 '2013-01-02' 'ABC'  1  3 10 A 4000 
2 '2013-01-01' 'ABC'  1  2  6 B 2500 
3 '2013-01-02' 'ABC'  1  3  0 B 2500 

考慮到根據列表的順序對輸出進行排序,可能不需要分配兩個新的列類型。

+1

感謝艾漢,但到底是什麼'lreshape' ??? :D你在哪裏找到它 –

+2

我認爲unutbu找到它:)(見答案[here](http://stackoverflow.com/a/35483228/2285236))。我第一次在jezrael的答案中看到了它。你可以輸入pd.lreshape? *限*文件。 – ayhan

+0

哈哈這是一個偉大的捕獲,但我們可以安全地假設該功能行爲正確嗎?實驗可能意味着無處不在支持=錯誤? –