2012-06-15 15 views
10

otrzymuje następujące listy:Python - Grupa przez i podsumować listę krotek

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

Chciałbym grupa nich przez pierwszego, drugiego, czwartego i piątego kolumn w krotki i suma 3rd. W tym przykładzie nazwę kolumny jako col1, col2, col3, col4, col5.

W SQL chciałbym zrobić coś takiego:

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

tam jest „cool” sposobem na to, czy jest to wszystko instrukcja pętli?

Odpowiedz

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

(UWAGA: Wyjście sformatowany)

+0

To działa jeszcze lepiej - dzięki! – jbassking10

12

Chcesz itertools.groupby.

Zauważ, że groupby spodziewa się, że wejście do być sortowane, więc może trzeba to zrobić przed strony:

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

+0

Dzięki - działa idealnie! – jbassking10

1

Jeśli znajdziesz się w ten sposób dużo z dużymi zestawami danych, możesz zajrzeć do biblioteki pandas, która ma wiele fajnych urządzeń do robienia tego typu rzeczy.