如何将属于同一个键的所有值相加?

时间:2018-04-01 23:39:42

标签: python python-3.x pymysql

我从数据库中提取数据并假设我有类似的东西:

    Product Name    Quantity
    a               3
    a               5
    b               2
    c               7

我想根据产品名称对数量求和,所以这就是我想要的:

    product = {'a':8, 'b':2, 'c':7 }

以下是从数据库中获取数据后我想要做的事情:

    for row in result:
       product[row['product_name']] += row['quantity']

但是这会给我:'a'= 5,而不是8。

5 个答案:

答案 0 :(得分:2)

选项1:pandas

这是一种方法,假设您从pandas数据框df开始。该解决方案具有O(n log n)复杂度。

product = df.groupby('Product Name')['Quantity'].sum().to_dict()

# {'a': 8, 'b': 2, 'c': 7}

您的想法是可以执行groupby操作,该操作会生成一个由"产品名称"索引的系列。然后使用to_dict()方法转换为字典。

选项2:collections.Counter

如果您从结果的列表或迭代器开始,并希望使用for循环,则可以使用collections.Counter来表示O(n)复杂性。

from collections import Counter

result = [['a', 3],
          ['a', 5],
          ['b', 2],
          ['c', 7]]

product = Counter()

for row in result:
    product[row[0]] += row[1]

print(product)
# Counter({'a': 8, 'c': 7, 'b': 2})

选项3:itertools.groupby

您还可以将词典理解与itertools.groupby一起使用。这需要事先进行分类。

from itertools import groupby

res = {i: sum(list(zip(*j))[1]) for i, j in groupby(sorted(result), key=lambda x: x[0])}

# {'a': 8, 'b': 2, 'c': 7}

答案 1 :(得分:0)

如果你坚持使用循环,你可以这样做:

# fake data to make the script runnable
result = [
  {'product_name': 'a', 'quantity': 3},
  {'product_name': 'a', 'quantity': 5},
  {'product_name': 'b', 'quantity': 2},
  {'product_name': 'c', 'quantity': 7}
]

# solution with defaultdict and loops
from collections import defaultdict

d = defaultdict(int)
for row in result:
  d[row['product_name']] += row['quantity']

print(dict(d))

输出:

{'a': 8, 'b': 2, 'c': 7}

答案 2 :(得分:0)

使用tuple存储结果。

修改

不清楚所提到的数据是否真的是数据帧。

如果是,那么li = [tuple(x) for x in df.to_records(index=False)]

li = [('a', 3), ('a', 5), ('b', 2), ('c', 7)]
d = dict()
for key, val in li:
    val_old = 0
    if key in d:
        val_old = d[key]
    d[key] = val + val_old
print(d)

输出

{'a': 8, 'b': 2, 'c': 7}

答案 3 :(得分:0)

因为你提到了熊猫

dbRef.on('value', snap => { 
    question.insertAdjacentHTML('beforeend', '<p>' + snap.val() + '</p>');
});

答案 4 :(得分:-2)

SELECT product_name,SUM(quantity)FROM PRODUCT LEFT JOIN QUANTITY GROUP BY product_name