Python的 - GROUP BY和总结一个元组列表(Python - Group by and

2019-06-25 12:25发布

鉴于以下列表:

[
    ('A', '', Decimal('4.0000000000'), 1330, datetime.datetime(2012, 6, 8, 0, 0)),
    ('B', '', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 6, 4, 0, 0)),
    ('AA', 'C', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 5, 31, 0, 0)),
    ('B', '', Decimal('7.0000000000'), 1330, datetime.datetime(2012, 5, 24, 0, 0)),
    ('A', '', Decimal('21.0000000000'), 1330, datetime.datetime(2012, 5, 14, 0, 0))
]

我想这些组由所述第一,第二,第四和第五元组中的列和求和第三。 在这个例子中,我会命名的列COL1,COL2,COL3,COL4,COL5。

在SQL我会做这样的事情:

select col1, col2, sum(col3), col4, col5 from my table
group by col1, col2, col4, col5

是否有一个“酷”的方式来做到这一点还是所有手动循环?

Answer 1:

>>> [(x[0:2] + (sum(z[2] for z in y),) + x[2:5]) for (x, y) in
      itertools.groupby(sorted(L, key=operator.itemgetter(0, 1, 3, 4)),
      key=operator.itemgetter(0, 1, 3, 4))]
[
  ('A', '', Decimal('21.0000000000'), 1330, datetime.datetime(2012, 5, 14, 0, 0)),
  ('A', '', Decimal('4.0000000000'), 1330, datetime.datetime(2012, 6, 8, 0, 0)),
  ('AA', 'C', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 5, 31, 0, 0)),
  ('B', '', Decimal('7.0000000000'), 1330, datetime.datetime(2012, 5, 24, 0, 0)),
  ('B', '', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 6, 4, 0, 0))
]

(注意:输出重新格式化)



Answer 2:

你想itertools.groupby

需要注意的是groupby预计输入进行排序,所以你可能需要做的前手:

keyfunc = lambda t: (t[0], t[1], t[3], t[4])
data.sort(key=keyfunc)
for key, rows in itertools.groupby(data, keyfunc):
    print key, sum(r[2] for r in rows)


Answer 3:

如果你发现自己做这个有很多大型数据集,你可能想看看熊猫库,它有许多很好的设施,做这种事情。



文章来源: Python - Group by and sum a list of tuples