【问题标题】:Pandas pivot_table - How to make a MultiIndex from a mix of column values and column names?Pandas pivot_table - 如何从列值和列名的混合中创建 MultiIndex?
【发布时间】:2021-12-29 14:56:31
【问题描述】:

我对 Pandas 比较陌生。我有一个表单中的 DataFrame:

         A         B       C            D         E
0        1       1.1       a      23.7853   18.2647
1        1       1.2       a      23.7118   17.2387
2        1       1.1       b      24.1873   17.3874
3        1       1.2       b      23.1873   18.1748
4        2       1.1       a      24.1872   18.1847
...      ...     ...       ...     ...       ...

我想将它转变成一个由 A 和 B 列中的值以及列标题 [“D”、“E”] 构建的三级 MultiIndex。我还想将 B 中的值用作新的列标题,并将 D 和 E 列中的数据用作值。所有值都是一对一的(带有一些 NaN)。如果我理解正确,由于 MultiIndex,我需要使用 pivot_table() 而不仅仅是 pivot()。最终我想要一个看起来像这样的表格:

B                      1.1       1.2  ...
A    C  col-name
1    a         D   23.7853   23.7118  ...
               E   18.2647   17.2387  ...
     b         D   24.1873   23.1873  ...
               E   17.3874   18.1748  ...
2    a         D   24.1872   23.1987  ...
               E   18.1847   19.2387  ...
...  ...     ...     ...       ...    ...

我很确定答案是使用类似的命令

pd.pivot_table(df, columns=["B"], values=["D","E"], index=["A","C","???"])

我不确定在“值”和“索引”参数中添加什么以获得正确的行为。

如果我不能用一个 pivot_table 命令来做到这一点,我需要提前构建我的多索引吗?然后呢?

谢谢!

【问题讨论】:

    标签: python pandas pivot-table multi-index


    【解决方案1】:

    使用列A, C, B 创建多索引,然后使用 stack + unstack 重塑数据框

    df.set_index(['A', 'C', 'B']).stack().unstack(-2)
    

    B          1.1      1.2
    A C                    
    1 a D  23.7853  23.7118
        E  18.2647  17.2387
      b D  24.1873  23.1873
        E  17.3874  18.1748
    2 a D  24.1872      NaN
        E  18.1847      NaN
    

    【讨论】:

    • 看起来堆叠后,unstack的正确索引实际上是-3而不是-2。这正是我想要的:df.set_index(['A', 'C', 'B']).stack().unstack(-3) 谢谢!
    【解决方案2】:

    pd.pivot_table()可以和.stack()一起使用,如下:

    (pd.pivot_table(df, index=['A', 'C'], columns='B', values=["D","E"])
       .rename_axis(columns=['col_name', 'B'])         # set axis name for ["D","E"] 
       .stack(level=0)
    )
    

    结果:

    B                 1.1      1.2
    A C col_name                  
    1 a D         23.7853  23.7118
        E         18.2647  17.2387
      b D         24.1873  23.1873
        E         17.3874  18.1748
    2 a D         24.1872      NaN
        E         18.1847      NaN
    

    【讨论】:

    • 这行得通,但我接受了@Shubham Sharma 的回答,因为它更简洁,而且似乎在我的大型数据集上运行得更快。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 2015-12-15
    • 2016-01-22
    • 1970-01-01
    • 2019-08-27
    • 2019-06-30
    • 2018-01-29
    • 2018-03-01
    相关资源
    最近更新 更多