如何使用Python 3.7汇总数据?

时间:2019-02-01 08:49:26

标签: python python-3.x

我有CSV文件,我将其转换为字典。字典中的一行如下所示:-

OrderedDict([('MVA', '10072672'), ('Code', 'F5'), ('Tbk Mnth', '01-Dec-16'), ('Branch', 'W0S'), ('Make', 'VOLKSWAGENRSA'), ('Status', 'RISK'), ('Price', '111200.27')])

我正在尝试对“价格”列中的值求和,但n =0。我在做什么错?还有,对不同代码求和的最有效方法是什么?

import csv
linecount = 0
with open(r'C:\Users\anthony\Documents\Test\Data.csv') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row)
        code = (row["Code"])
        if code == 'F5':
            linecount += 1

    print(linecount)



    n = sum([item['Price'] for item in reader])
    print(n)

2 个答案:

答案 0 :(得分:2)

一个问题是您不能两次遍历读取器。

defaultdict模块中的collections类对于分组项目非常方便。 在这里,我们将Price(为了精确而投射到Decimal中)收集到列表的字典中,然后对其求和。

import csv
import decimal
import collections

# Defaultdicts are handy in that they never have nonexistent keys;
# if you access an nonexistent key, the constructor (`list` here)
# is invoked.

prices_by_code = collections.defaultdict(list)

with open(r'Data.csv') as file:
    reader = csv.DictReader(file)
    for row in reader:
        price = row.get('Price')
        code = row.get('Code')
        if code and price:
            prices_by_code[code].append(decimal.Decimal(price))

# By this time,  `prices_by_code` looks approximately like
# {"5": [1, 2, 3], "8": [4, 5, 6]}

for code, prices in sorted(prices_by_code.items()):
    print(code, sum(prices))

答案 1 :(得分:0)

reader是一个迭代器。通过迭代它可以消耗其值。如果需要保留这些值,则必须将其存储在其他位置。最简单的方法是从迭代器创建一个列表,然后遍历该列表。

例如。

rows = list(reader)

for row in rows:
   ...

n = sum([item['Price'] for item in rows])

但是,价格将是字符串而不是浮点数。因此,您将理解列表,将其转换为浮点数。例如。 float(item['Price'])