熊猫通过扩展列将多行合并为单个行

时间:2020-07-20 00:10:22

标签: python pandas pivot aggregate pandas-groupby

我正在编写脚本,用于根据bechmarks结果数据绘制数十个图形。我的原始数据格式如下:

"Benchmark","Mode","Threads","Samples","Score","Score Error (99,9%)","Unit","Param: times"
"package.filtering.first.ReactorFirst.singleFirst","avgt",1,5,"0,000154","0,000011","ms/op",1
"package.filtering.first.ReactorFirst.singleFirst","avgt",1,5,"0,000150","0,000016","ms/op",1000
...

"package.filtering.r.ReactorFirst.singleFirst:+forced-gc-mem.<type>.<subtype>","avgt",1,5,"0,000162","0,000039","ms/op",10000000
...

其中过滤(模块),第一个(操作员),反应堆(解决方案),单个(方法)是创建基准的每种基准的属性。这种层次结构对我很重要,因为我的意图是基于整个module级别,operator级别共享的模块中的某些solution等应用不同的绘图策略,等等。

我决定尝试使用正则表达式从基准名称列中提取上述信息,并使用MultiIndex结构:

                                                             times                                     score                                          benchmark                                     error
module      operator solution method                                                                                                                                                                     
conditional asdda2s  Reactor  single                    [10000000]                                [0,000162]  package.conditional.asdda2s.ReactorFirst.singl...                                [0,000039]
            asddas   Reactor  single                    [10000000]                                [0,000162]  package.conditional.asddas.ReactorFirst.single...                                [0,000039]
filtering   first    Reactor  single  [1, 1000, 1000000, 10000000]  [0,000154, 0,000150, 0,000153, 0,000162]                                                 []  [0,000011, 0,000016, 0,000025, 0,000039]
            first4   Reactor  single                    [10000000]                                [0,000162]  package.filtering.first4.ReactorFirst.singleFirst                                [0,000039]
df = pd.read_csv(..., delimiter=',')
df.columns = ['benchmark', 'mode', 'threads', 'samples', 'score', 'error', 'unit', 'times']

byModule = df.benchmark.str.extract(moduleRegex, expand=False).rename('module')
byOperator = df.benchmark.str.extract(operatorRegex, expand=False).rename('operator')
bySolution = df.benchmark.str.extract(solutionRegex, expand=False).rename('solution')
byMethod = df.benchmark.str.extract(methodRegex, expand=False).rename('method')

aggregator = {
    'benchmark': lambda x: x,
    'score': lambda x: x.tolist(),
    'error': lambda x: x.tolist(),
    'times': lambda x: x.tolist(),
}

multiGrouped = df.groupby(by=[byModule, byOperator, bySolution, byMethod])['benchmark', 'score', 'error', 'times'].agg(aggregator)

modules = multiGrouped.index.unique(level='module').values

for module in modules:
    moduleGroup = multiGrouped.loc[module]
    operators = moduleGroup.index.unique(level='operator').values

    for operator in operators:
        operatorGroup = moduleGroup.loc[operator]
        methods = operatorGroup.index.unique(level='method').values

        print operatorGroup
        # plotting...

基于这些因素的分组使我可以将结果汇总为单行(由于不同的Param: times而导致多个结果),并使用toList()来计算得分/错误/时间参数

但是结果有些变化。每个(module, operator, solution, method)都会有多个新行匹配,每行描述此基准测试的不同内存指标。

它的名称(类型/子类型)是唯一的,因此在这种情况下正则表达式也可能起作用。我的问题是如何以相同的聚合metricType/SubtypeError将这些行中的转置/透视图(分数,错误,参数)到用类似score(和toList()等类似)描述的新列中。分数/错误的情况与原始案例一样。

有可能吗?我对python没有太多经验,但是在pandas库中发现它有点困难。

谢谢

0 个答案:

没有答案