解析CSV文件并聚合值

4 投票
2 回答
5198 浏览
提问于 2025-04-17 09:54

我想要处理一个CSV文件,并把里面的数值进行汇总。这个文件中的城市这一行有重复的值(举个例子):

CITY,AMOUNT
London,20
Tokyo,45
London,55
New York,25

处理完后,结果应该像这样:

CITY, AMOUNT
London,75
Tokyo,45
New York,25

我写了以下代码来提取独特的城市名称:

def main():
    contrib_data = list(csv.DictReader(open('contributions.csv','rU')))
    combined = []
    for row in contrib_data:
      if row['OFFICE'] not in combined:
        combined.append(row['OFFICE'])

那么接下来我该怎么汇总这些数值呢?

2 个回答

0

使用一个字典,值设置为金额,可能会解决这个问题。可以这样做:

假设你一次读取一行数据,city表示当前的城市,amount表示当前的金额 -

main_dict = {}

---for loop here---
if city in main_dict:
    main_dict[city] = main_dict[city] + amount
else:
    main_dict[city] = amount
---end for loop---

在循环结束时,你会在main_dict中得到汇总的数值。

7

在Python 3.2.2中进行了测试:

import csv
from collections import defaultdict
reader = csv.DictReader(open('test.csv', newline=''))
cities = defaultdict(int)
for row in reader:
    cities[row["CITY"]] += int(row["AMOUNT"])

writer = csv.writer(open('out.csv', 'w', newline = ''))
writer.writerow(["CITY", "AMOUNT"])
writer.writerows([city, cities[city]] for city in cities)

结果是:

CITY,AMOUNT
New York,25
London,75
Tokyo,45

关于你添加的要求:

import csv
from collections import defaultdict

def default_factory():
    return [0, None, None, 0]

reader = csv.DictReader(open('test.csv', newline=''))
cities = defaultdict(default_factory)
for row in reader:
    amount = int(row["AMOUNT"])
    cities[row["CITY"]][0] += amount
    max = cities[row["CITY"]][1]
    cities[row["CITY"]][1] = amount if max is None else amount if amount > max else max
    min = cities[row["CITY"]][2]
    cities[row["CITY"]][2] = amount if min is None else amount if amount < min else min
    cities[row["CITY"]][3] += 1
for city in cities:
    cities[city][3] = cities[city][0]/cities[city][3] # calculate mean

writer = csv.writer(open('out.csv', 'w', newline = ''))
writer.writerow(["CITY", "AMOUNT", "max", "min", "mean"])
writer.writerows([city] + cities[city] for city in cities)

这样你就得到了

CITY,AMOUNT,max,min,mean
New York,25,25,25,25.0
London,75,55,20,37.5
Tokyo,45,45,45,45.0

请注意,在Python 2中,你需要在最上面加上一行代码 from __future__ import division,这样才能得到正确的结果。

撰写回答