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

これらをタプルの1列目、2列目、4列目、5列目でグループ化し、3列目を合計します。この例では、列にcol1、col2、col3、col4、col5という名前を付けます。

SQLでは、次のようにします。

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

これを行うための「クールな」方法はありますか、それともすべて手動ループですか?

4

3 に答える 3

15

あなたが欲しい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)
于 2012-06-15T20:54:17.733 に答える
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))
]

(注:出力は再フォーマットされています)

于 2012-06-15T20:56:39.563 に答える
1

大規模なデータセットでこれを頻繁に行う場合は、この種のことを行うための優れた機能がたくさんあるpandasライブラリを確認することをお勧めします。

于 2012-06-15T21:16:43.033 に答える