如何组合熊猫数据透视表中的列?

Posted

技术标签:

【中文标题】如何组合熊猫数据透视表中的列?【英文标题】:How to combine columns in pandas pivot table? 【发布时间】:2021-08-21 01:52:49 【问题描述】:

我有一个包含 3 级列的数据透视表。对于每个唯一的均值和标准,我想将它们组合成一个 str f"x.mean(x.std)" 用新的 mean_std_str 列替换均值和标准列。

这是数据框的打印:

rescore_func   asp                 chemscore  ... goldscore   plp                
tag           best      first           best  ...     first  best      first     
              mean  std  mean  std      mean  ...       std  mean  std  mean  std
dock_func                                     ...                                
asp           65.2  0.7  34.5  2.4      64.0  ...       0.0  64.4  0.7  37.9  0.7
chemscore     59.1  2.0  29.5  2.0      58.0  ...       1.7  58.7  0.7  40.9  2.3
goldscore     68.9  1.7  34.8  4.3      69.7  ...       1.3  68.9  1.3  46.2  0.7
plp           69.3  1.1  35.2  2.0      69.7  ...       2.0  68.9  2.4  39.4  2.9

[4 rows x 16 columns]

期望的输出:

rescore_func   asp                             
tag            best       first           ...  
               mean_std   mean_std        ...
dock_func                                 ...                                 
asp            65.2(0.7)  34.5(2.4)       ...
chemscore      59.1(2.0)  29.5(2.0)       ... 
goldscore      68.9(1.7)  34.8(4.3)       ...
plp            69.3(1.1)  35.2(2.0)       ...

[4 rows x 16 columns]

到目前为止,我有:

df = df.melt(ignore_index=False).reset_index()
df = df.rename(columns=str).rename(columns='None':'descr')

给出:

    dock_func rescore_func    tag descr  value
0         asp          asp   best  mean   65.2
1   chemscore          asp   best  mean   59.1
2   goldscore          asp   best  mean   68.9
3         plp          asp   best  mean   69.3
4         asp          asp   best   std    0.7
..        ...          ...    ...   ...    ...
59        plp          plp  first  mean   39.4
60        asp          plp  first   std    0.7
61  chemscore          plp  first   std    2.3
62  goldscore          plp  first   std    0.7
63        plp          plp  first   std    2.9

[64 rows x 5 columns]

我被困在如何在重新透视数据之前将手段和标准组合在一起......

【问题讨论】:

你能告诉我们预期的输出吗,决赛桌应该怎么看? 【参考方案1】:

DataFrame.reorder_levels 会让您轻松搞定。

这是一些示例数据:

import numpy as np
import pandas as pd


index = pd.Index(["asp", "chemscore", "goldscore", "plp"], name="dock_func")
columns = pd.MultiIndex.from_product(
    [index, pd.Index(["best", "fisrt"], name="tag"), ("mean", "std")]
)

df = pd.DataFrame(
    np.random.random(size=(4, 16)),
    index=index,
    columns=columns,
).round(1)

df 看起来像:

dock_func  asp                 chemscore                 goldscore                  plp
tag       best      fisrt           best      fisrt           best      fisrt      best      fisrt
          mean  std  mean  std      mean  std  mean  std      mean  std  mean  std mean  std  mean  std
dock_func
asp        0.5  0.6   0.4  0.2       0.7  0.7   0.8  0.1       0.2  0.5   0.6  0.7  0.5  0.2   0.2  0.7
chemscore  0.0  0.7   0.9  0.2       0.3  0.3   0.4  0.8       0.3  0.4   0.2  0.8  0.5  0.5   0.4  0.2
goldscore  0.5  0.7   0.8  0.0       0.2  0.8   0.1  0.2       0.6  0.1   0.4  0.2  0.8  0.2   0.8  0.3
plp        1.0  0.6   0.6  0.8       0.8  0.6   0.3  1.0       0.7  0.2   0.8  0.2  0.2  0.2   0.7  0.2

然后只需运行以下命令:

df = df.reorder_levels([2, 0, 1], axis=1).astype(str)
df = df["mean"] + "(" + df["std"] + ")"

df 是:

dock_func       asp           chemscore           goldscore                 plp
tag            best     fisrt      best     fisrt      best     fisrt      best     fisrt
dock_func
asp        0.5(0.6)  0.4(0.2)  0.7(0.7)  0.8(0.1)  0.2(0.5)  0.6(0.7)  0.5(0.2)  0.2(0.7)
chemscore  0.0(0.7)  0.9(0.2)  0.3(0.3)  0.4(0.8)  0.3(0.4)  0.2(0.8)  0.5(0.5)  0.4(0.2)
goldscore  0.5(0.7)  0.8(0.0)  0.2(0.8)  0.1(0.2)  0.6(0.1)  0.4(0.2)  0.8(0.2)  0.8(0.3)
plp        1.0(0.6)  0.6(0.8)  0.8(0.6)  0.3(1.0)  0.7(0.2)  0.8(0.2)  0.2(0.2)  0.7(0.2)

【讨论】:

以上是关于如何组合熊猫数据透视表中的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除熊猫数据透视表中的多级索引

如何合并熊猫数据透视表中的多索引层?

熊猫数据透视表中的小计

熊猫:从数据透视表中的另一列中减去一列

为熊猫数据透视表中的每个值列定义 aggfunc

将数据解析/反透视到熊猫数据框中的列中