【问题标题】:Apply multiple aggregate functions on a list without using pandas在不使用 pandas 的情况下在列表上应用多个聚合函数
【发布时间】:2021-06-03 15:05:33
【问题描述】:

我有一个行列表,有两个键列和 6 个值 列。 我想计算总和、平均值和最大值 基于每个函数的列列表的值列, 按键列分组,使用itertools.groupby, 不使用熊猫。

columns = [ID, date, row1, row2, row3, row4, row5, row6]
rows = [[1, date1, 1,     1,    1,   0,    0,  1],
        [1, date1, 1,     2,    0,   1,    0,  1],
        [2, date1, 1,     3,    0,   0,    1,  1], 
        [2, date1, 1,     3,    0,   0,    2,  1]]

ColSum = [row2, row6]
ColMean = [row1, row3]
ColMax = [row4, row5]

我期望计算的结果:

rows_result = [[1, date1, 1,     3,  0.5,   1,    0,  2],
               [2, date1, 1,     6,    0,   0,    2,  2]] 

我的代码:

for cols in ColSum:
  index = int(np.where(columns == cols)[0][0])
        
  for k, g in itertools.groupby(rows[:, index], operator.itemgetter(0,1)):
    res.append((list(k) +list(map(sum, zip(*[c[2:] for c in g])))))

for colm in colMean:
  index = int(np.where(columns == colm)[0][0])
    
  for k, g in itertools.groupby(rows[:, index], operator.itemgetter(0,1)):
    res.append((list(k) +list(map(sum, zip(*[c[2:] for c in g])))))

但是,这不起作用。

【问题讨论】:

  • 不确定你想要什么,例如ColSum = [row2, row6].

标签: python list numpy group-by itertools


【解决方案1】:

在构造时分别计算每个分组的列结果 结果列表非常复杂。在ColSum 的初始构建之后, 您必须编辑每个行级元素。可以,但我不会 认为它符合函数式编程的精神。

相反,下面的程序使用ColFun来设置要应用的函数 每一列(相当于第 1 行到第 6 行)。在for 循环中, 它贯穿每个组(如(1, 'date1')),同时构建 6 个值列的列表,其中包含请求的功能应用程序 列。

结果被附加到一个列表中,该列表与(略微编辑的)期望相匹配 结果。

import itertools
import operator
import numpy as np

columns = ['ID', 'date', 'row1', 'row2', 'row3', 'row4', 'row5', 'row6']
rows = [[1, 'date1', 1,     1,    1,   0,    0,  1],
        [1, 'date1', 1,     2,    0,   1,    0,  1],
        [2, 'date1', 1,     3,    0,   0,    1,  1], 
        [2, 'date1', 1,     3,    0,   0,    2,  1]]

ColSum = ['row2', 'row6']
ColMean = ['row1', 'row3']
ColMax = ['row4', 'row5']
ColFun = [np.mean, np.sum, np.mean, np.max, np.max, np.sum]
rows_result = [[1, 'date1', 1.0,   3,  0.5,   1,    0,  2],
               [2, 'date1', 1.0,   6,  0.0,   0,    2,  2]]

res = []
for k,g in itertools.groupby(rows, operator.itemgetter(0,1)):
    res.append(list(k) + [sum(map(z[0], z[1:])) for z in
        zip(ColFun, zip(*[c[2:] for c in g]))]
        )
print(res == rows_result)
# True
print(res)
# [[1, 'date1', 1.0, 3, 0.5, 1, 0, 2],
#  [2, 'date1', 1.0, 6, 0.0, 0, 2, 2]]

【讨论】:

  • 谢谢,我喜欢这个答案,它对我帮助很大。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2017-08-10
  • 2023-02-10
相关资源
最近更新 更多