转置多列潘达斯数据框架[英] transpose multiple columns Pandas dataframe

本文是小编为大家收集整理的关于转置多列潘达斯数据框架的处理方法,想解了转置多列潘达斯数据框架的问题怎么解决?转置多列潘达斯数据框架问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试重塑数据框,但无法获得所需的结果.数据框如下所示:

    m   r   s   p   O       W       N         
    1   4   3   1   2.81    3.70    3.03  
    1   4   4   1   2.14    2.82    2.31  
    1   4   5   1   1.47    1.94    1.59  
    1   4   3   2   0.58    0.78    0.60  
    1   4   4   2   0.67    0.00    0.00
    1   4   5   2   1.03    2.45    1.68
    1   4   3   3   1.98    1.34    1.81
    1   4   4   3   0.00    0.04    0.15
    1   4   5   3   0.01    0.00    0.26

我需要重塑数据框,使其看起来像这样:

    m   r   s   p   O       W       N      p    O       W       N     p  O      W       N
    1   4   3   1   2.81    3.70    3.03   2    0.58    0.78    0.60  3  1.98   1.34    1.81
    1   4   4   1   2.14    2.82    2.31   2    0.67    0.00    0.00  3 0.00    0.04    0.15
    1   4   5   1   1.47    1.94    1.59   2    1.03    2.45    1.68  3 0.01    0.00    0.26

我尝试使用pivot_table函数

df.pivot_table(index=['m','r','s'], columns=['p'], values=['O','W','N']) 

但我无法得到我想要的.有谁知道怎么做?

推荐答案

作为一个自认为对 pandas 非常好用的人,pivot_table 和 melt 函数让我感到困惑.我更喜欢坚持使用定义明确且唯一的索引,并使用数据帧本身的 stack 和 unstack 方法.

首先,我会问你是否真的需要像那样重复 p 列?在呈现数据时我可以看到它的价值,但 IMO pandas 并没有真正设置为这样工作.我们可以硬塞进去,但让我们看看是否有更简单的解决方案可以满足您的需求.

我会这样做:

from io import StringIO
import pandas

datatable = StringIO("""\
    m   r   s   p   O       W       N         
    1   4   3   1   2.81    3.70    3.03  
    1   4   4   1   2.14    2.82    2.31  
    1   4   5   1   1.47    1.94    1.59  
    1   4   3   2   0.58    0.78    0.60  
    1   4   4   2   0.67    0.00    0.00
    1   4   5   2   1.03    2.45    1.68
    1   4   3   3   1.98    1.34    1.81
    1   4   4   3   0.00    0.04    0.15
    1   4   5   3   0.01    0.00    0.26""")

df = (
    pandas.read_table(datatable, sep='\s+')
          .set_index(['m', 'r', 's', 'p'])
          .unstack(level='p')
)

df.columns = df.columns.swaplevel(0, 1)
df.sort(axis=1, inplace=True)

print(df)

哪些打印:

p         1                 2                 3            
          O     W     N     O     W     N     O     W     N
m r s                                                      
1 4 3  2.81  3.70  3.03  0.58  0.78  0.60  1.98  1.34  1.81
    4  2.14  2.82  2.31  0.67  0.00  0.00  0.00  0.04  0.15
    5  1.47  1.94  1.59  1.03  2.45  1.68  0.01  0.00  0.26

所以现在这些列是一个 MultiIndex,例如,您可以访问 p = 2 与 df[2] 或 df.xs(2, level='p', axis=1) 的所有值,这给了我:

          O     W     N
m r s                  
1 4 3  0.58  0.78  0.60
    4  0.67  0.00  0.00
    5  1.03  2.45  1.68

同样,您可以使用以下命令获取所有 W 列:df.xs('W', level=1, axis=1)(我们说level=1)因为该列级别没有名称,所以我们使用它的位置来代替)

p         1     2     3
m r s                  
1 4 3  3.70  0.78  1.34
    4  2.82  0.00  0.04
    5  1.94  2.45  0.00

您可以类似地使用 axis=0 查询列.

如果您真的需要列中的 p 值,只需手动添加它并重新索引您的列:

for p in df.columns.get_level_values('p').unique():
    df[p, 'p'] = p

cols = pandas.MultiIndex.from_product([[1,2,3], list('pOWN')])
df = df.reindex(columns=cols)
print(df)

       1                    2                    3                  
       p     O     W     N  p     O     W     N  p     O     W     N
m r s                                                               
1 4 3  1  2.81  3.70  3.03  2  0.58  0.78  0.60  3  1.98  1.34  1.81
    4  1  2.14  2.82  2.31  2  0.67  0.00  0.00  3  0.00  0.04  0.15
    5  1  1.47  1.94  1.59  2  1.03  2.45  1.68  3  0.01  0.00  0.26

本文地址:https://www.itbaoku.cn/post/1727994.html