如何将透视表转换为分析多级列的单层

2024-06-28 19:57:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我使用以下代码将其聚合到一个透视表中:

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,而所有其他参数都是相同的(用*标记的具体示例)

我如何转换我的表以便得到以下结构?我试着去堆叠和转换,但那没有给我正确的行和列索引集。我相信有办法。对不起,我遗漏了一些明显的东西

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

Tags: programparam1param2p3offp1param4param3
1条回答
网友
1楼 · 发布于 2024-06-28 19:57:39

为了完整起见,我发布了我后来发现的解决方案:

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

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

相关问题 更多 >