Python - 对包含元组的列表进行分组和求和

12

给定以下列表:

[
    ('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

有没有一种“酷”的方式来做这件事,还是说都需要手动循环?

3个回答

16

您需要使用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)

3
operator.itemgetter(0,1,3,4) - JBernardo

7
>>> [(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))
]

(NOTE: output reformatted)


1
如果您经常使用大型数据集进行此操作,您可能需要查看pandas库,该库具有许多用于执行此类操作的良好功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接