2012-03-28 16 views
3

ich ein Rowset haben, die wie folgt aussieht:Wie Spaltenwerte mit Python Summe

defaultdict(<type 'dict'>, 
{ 
    u'row1': {u'column1': 33, u'column2': 55, u'column3': 23}, 
    u'row2': {u'column1': 32, u'column2': 32, u'column3': 17}, 
    u'row3': {u'column1': 31, u'column2': 87, u'column3': 18} 
}) 

ich leicht in der Lage sein wollen, um die Summe von column1, column2, column3 zu bekommen. Es wäre großartig, wenn ich dies für eine beliebige Anzahl von Spalten tun könnte und das Ergebnis in einer Hash-Map erhalten würde, die wie folgt aussieht: columnName => columnSum. Wie Sie sich denken können, ist es mir nicht möglich, die summierten Werte von der Datenbank an erster Stelle zu erhalten, daher der Grund, die Frage zu stellen.

Antwort

7
>>> from collections import defaultdict 
>>> x = defaultdict(dict, 
    { 
     u'row1': {u'column1': 33, u'column2': 55, u'column3': 23}, 
     u'row2': {u'column1': 32, u'column2': 32, u'column3': 17}, 
     u'row3': {u'column1': 31, u'column2': 87, u'column3': 18} 
    }) 

>>> sums = defaultdict(int) 
>>> for row in x.itervalues(): 
     for column, val in row.iteritems(): 
      sums[column] += val 


>>> sums 
defaultdict(<type 'int'>, {u'column1': 96, u'column3': 58, u'column2': 174}) 

Ooh ein viel besserer Weg!

>>> from collections import Counter 
>>> sums = Counter() 
>>> for row in x.values(): 
     sums.update(row) 


>>> sums 
Counter({u'column2': 174, u'column1': 96, u'column3': 58}) 
+3

+1 für explizit besser als implizit und Ausgabe von der Konsole. –

0

nicht die pythonic aber hier:

for val in defaultdict.values() : 
    sum1 += val['column1'] 
    sum2 += val['column2'] 
    sum3 += val['column3'] 
final_dict = {'column1' : sum1,'column2' : sum2,'column3' : sum3 } 
2

Nested Generatoren + Liste Verständnis funktioniert der Trick:

>>> foo 
defaultdict(<type 'dict'>, {u'row1': {u'column1': 33, u'column3': 23, u'column2': 55}, u'row2': {u'column1': 32, u'column3': 17, u'column2': 32}, u'row3': {u'column1': 31, u'column3': 18, u'column2': 87}}) 
>>> dict(zip(foo.values()[0].keys(), [sum(j[k] for j in (i.values() for _,i in foo.items())) for k in range(3)])) 
{u'column1': 96, u'column3': 58, u'column2': 174} 
+0

Gibt das Ergebnis in einer Hash-Map zurück? – jamylak

+0

tut jetzt, @jamylak – Kimvais

0

Hier ist eine andere Antwort, wenn ich eine Lösung vorschlagen kann. Stellen Sie zuerst Ihre Daten in eine Matrix. Dann multipliziere die Matrix mit einem Vektor von Einsen.

import numpy as np 
A = np.random.normal(size = (3,3)) 

Jetzt, um die Summe der Spalten zu erhalten, verwenden Sie einfach das Punktprodukt.

np.dot(A, np.ones(3)) 

Um die Zeilen zu stapeln, anstatt die Spalten einfach die Matrix transponieren.

np.dot(A.T, np.ones(3)) 
Verwandte Themen