如何转换 pivot table 来分析 multiset 列的单层

How to transform pivot table to analyze single level of multiset column

我有大量数据需要验证,大致如下简化形式:

program;param0;param1;param2;param3;param4;param5;WCET
bench1;P1;2;0;0;OFF;ALG1;23835
bench1;P1;4;4;0;OFF;ALG2;11520
bench2;P3;4;3;2;OFF;ALG1;2480450
bench2;P3;4;3;2;BB;ALG1;2480620
bench3;P2;6;2;2;BB;ALG3;2290
bench3;P2;4;4;0;OFF;ALG4;2490

我已使用以下代码将其全部聚合到一个数据透视表 table 中:

import numpy as np
import pandas as pd


def process_test_data():
    raw = pd.read_csv("omitted", sep=";")

    print("* benchmarks aggregated ")
    benchmarks_aggregated = pd.pivot_table(raw,
                                       values=['WCET'],
                                       index=['program'],
                                       columns=['param0', 'param1', 'param2', 'param3', 'param4', 'param5', ],
                                       aggfunc={'WCET': [min, max]})
    print(benchmarks_aggregated)

这给了我以下输出。

              WCET                        ...                                 
               max                        ...        min                      
param0          P1                        ...         P3                      
param1           2          4             ...          6                      
param2           0          3             ...          2                      
param3           0          0             ...          2                      
param4         OFF         BB             ...        OFF                      
param5        ALG1       ALG1       ALG2  ...       ALG3       ALG4       ALG5
program                                   ...                                 
bench1     23835.0   13460.0*   13610.0*  ...     8085.0     8280.0    10015.0
bench2   7439895.0  3777375.0  3682345.0  ...  2480085.0  2480350.0  3182175.0
bench3      6480.0     4050.0     4160.0  ...     2220.0     2340.0     3050.0

但是,为了进一步的健全性检查,我需要一个转换后的表示,我可以在其中比较每个不同参数集的 ALG[X] 值。例如,我需要知道ALG2的最大WCET是否总是大于ALG1的,而所有其他参数都相同(具体示例以*标记)。

如何转换 table 以获得以下结构?我尝试了拆栈和转换,但这并没有给我正确的行和列索引集。我相信有办法。对不起,如果我遗漏了一些明显的东西。

* WCETmaxTable
           ALG1     ALG2     ALG3
0          ...      ...      ...
1          ...      ...      ...
...
n          ...      ...      ...

为了完整起见,我post后来找到的解决方案:

这首先将行索引转换为列,然后将所有列级别转换为索引,然后仅 param5 再次返回到列。为了简化问题示例中的多索引,之后用范围计数器替换索引。

    benchmarks_aggregated = benchmarks_aggregated.unstack().T.unstack(level='param5')
    benchmarks_aggregated.index = range(len(benchmarks_aggregated))