2017-06-21 347 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