如何转换 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))
我有大量数据需要验证,大致如下简化形式:
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))