在不使用 pandas 的情况下对列表应用多个聚合函数
Apply multiple aggregate functions on a list without using pandas
我有一个行列表,有两个键列和 6 个值
列。
我想计算总和、均值和最大值
值列的数量,基于每个函数的列列表,
按键列分组,使用 itertools.groupby
,
不使用 pandas.
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
的初始构建之后,
您将不得不编辑每个行级元素。可以做到,但我不会
认为它符合函数式编程的精神。
相反,下面的程序使用 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]]
我有一个行列表,有两个键列和 6 个值
列。
我想计算总和、均值和最大值
值列的数量,基于每个函数的列列表,
按键列分组,使用 itertools.groupby
,
不使用 pandas.
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
的初始构建之后,
您将不得不编辑每个行级元素。可以做到,但我不会
认为它符合函数式编程的精神。
相反,下面的程序使用 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]]