2017-06-21 346 views
2

所以我的代碼的組織方式與以下類似。它創建充滿元組列:將元組的pandas列轉換爲MultiIndex

import pandas as pd 

d = [] 
d.append({'wilderness':('bear','salmon'), 'domestic':('cat','mouse'), 'farm':('wolf','sheep')}) 
d.append({'wilderness':('polar bear','seal'), 'domestic':('spider','fly'), 'farm':('cow','grass')}) 

pd.DataFrame(d) 

enter image description here

按照本例,每個元組的元素是相關的,這裏的捕食者和獵物。我真的不想將這些元組拆分爲不相關的單獨列,希望這些對之間的密切關係在結構中保持某種程度。

問題是,我的示例中的每個字符串都比這裏的動物名稱長一些,當我在Jupyter筆記本中查看數據框時,根本看不到元組的第二個元素,而且我需要能夠看到它,甚至選擇它等。

所以最初以爲Jupyter中可能會有一些設置會使每個元組元素都進入第二行。現在認爲最好的解決方案可能是pd.MultiIndex.from_tuples(),但在解決如何使用它時遇到了很多麻煩。看看幾個例子herehere

有誰知道如何做到這一點?應該有兩個級別的列標題,例如domestic-predator/prey和元組元素進入每個新的子列。

我儘量不要在Pandas和NumPy中使用for循環,但是這是一個很難不會出現性能問題的場合,所以如果解決方案仍然使用循環友好的方法創建數據幀。

編輯 - 這裏是所需的輸出

 domestic    farm     wilderness 
     predator prey  predator prey  predator prey 

0  cat  mouse  wolf  sheep  bear  salmon 
1  spider fly   cow  grass  polar bear seal 

回答

2

您可以使用concatlist comprehension

df = pd.concat([pd.DataFrame(x, columns=['predator','prey']) for x in df.values.T.tolist()], 
       axis=1, 
       keys=df.columns) 
print (df) 

    domestic   farm   wilderness   
    predator prey predator prey predator prey 
0  cat mouse  wolf sheep  bear salmon 
1 spider fly  cow grass polar bear seal 
+0

謝謝,它的工作原理!我正在研究如何。看看'df.values.T.tolist()'這是我見過的第一個使用'pd.DataFrame'命令的列表理解。我認爲'鍵'認爲你使用的是什麼,看起來不像是需要MultiIndex的東西。 – cardamom