【问题标题】:convert pandas column of tuples to MultiIndex将元组的 pandas 列转换为 MultiIndex
【发布时间】:2017-11-24 07:59:31
【问题描述】:

所以我的代码的组织方式类似于以下内容。它创建用元组填充的列:

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)

根据这个例子,每个元组的元素都是相关的,这里是捕食者和猎物。我真的不想将这些元组拆分为不相关的单独列,希望对之间的密切关系以某种方式保持在结构中。

问题是,我的示例中的每个字符串都比这里的动物名称长一点,当我在 Jupyter 笔记本中查看数据框时,我根本看不到元组的第二个元素,我需要能够看到它,甚至选择它等等。

所以最初认为 Jupyter 中可能有一些设置会使每个元组元素进入第二行。现在认为最好的解决方案可能是使用pd.MultiIndex.from_tuples(),但在弄清楚如何使用它时遇到了很多麻烦。看了几个例子herehere

有人知道怎么做吗?应该有两个级别的列标题,例如国内捕食者/猎物,元组元素进入每个新的子列。

我尽量不在 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

【问题讨论】:

    标签: python pandas dataframe jupyter-notebook multi-index


    【解决方案1】:

    您可以将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
    

    【讨论】:

    • 谢谢,它有效!我正在研究如何。看看df.values.T.tolist(),这是我第一次看到与pd.DataFrame 命令一起使用的列表理解。我认为keys 认为你使用的是它,它看起来毕竟不需要 MultiIndex 的东西。
    猜你喜欢
    • 2023-03-02
    • 2013-03-22
    • 2022-11-01
    • 2020-05-27
    • 2019-04-07
    • 2023-03-22
    • 2018-07-25
    • 2019-06-12
    • 2019-04-21
    相关资源
    最近更新 更多