按列分组并求和
我有以下这些内容
(Decimal('1.000'), Decimal('419.760000'), Decimal('4.197600000'), Decimal('423.957600000'))
(Decimal('1.000'), Decimal('62.370000'), Decimal('0.623700000'), Decimal('62.993700000'))
(Decimal('2.000'), Decimal('7.920000'), Decimal('0.079200000'), Decimal('7.999200000'))
我想根据第一列把它们分组,然后把其他列的数值加起来(就是按第一列分组,每一列单独总结一下)……但我不知道该怎么做……
我刚学python……有什么建议吗?
谢谢,
BR
2 个回答
0
如果输入是这样的:
inputData = [[1,2,3],
[1,3,4],
[5,6,7]]
你希望得到分组的总和,比如说前两行的总和(根据第一列的1进行分组),再加上第三行的值(因为在第一列中没有更多的5了),那么你可以使用下面的代码:
res = []
for i,val in enumerate(zip(*inputData )[0]):# first column
filtered = filter(lambda x: x[0] == val, inputData)
(not filtered in res and res.append(filtered))
print map(lambda comb: map(sum, zip(*comb)), res)
3
假设这三个元组是一个元组或列表 numbers
中的项目:
column_sums = [sum(items) for items in zip(*numbers)]
重新看了一下你的问题,我觉得你可能是想把每行第一个数字以外的所有数字按第一行的数字分组,然后计算每组的总和。如果是这样,可以这样做:
from collections import defaultdict
grouped = defaultdict(list)
for tpl in numbers:
grouped[tpl[0]].extend(tpl[1:])
group_sums = dict((key, sum(lst)) for key, lst in grouped.items())
如果你不需要中间的 grouped
变量,可以这样优化:
group_sums = defaultdict(int)
for tpl in numbers:
group_sums[tpl[0]] += sum(tpl[1:])
回复:评论
如果你一开始就给出你想要的输出示例,那就简单多了。例如,你可以在帖子中加上这个:
根据上面的例子,我想要这个输出:
{Decimal('1.000'): [ Decimal('482.130000'), Decimal('4.821300000'), Decimal('486.951300000')], Decimal('2.000'): [ Decimal('7.920000'), Decimal('0.079200000'), Decimal('7.999200000')]}
这样的话,我就可以立刻给出这个答案:
from itertools import izip_longest
group_sums = {}
for tpl in numbers:
previous_sum = group_sums.get(tpl[0], [])
iterator = izip_longest(previous_sum, tpl[1:], fillvalue=0)
group_sums[tpl[0]] = [prev + num for prev, num in iterator]
如果一组中的列数不同,这个方法也适用。请告诉我这次我理解问题正确了。 :)