Разберите CSV-файл и суммируйте значения

Я хотел бы проанализировать 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']) 

Как мне затем агрегировать значения?

  • Использование Python PIL для превращения RGB-изображения в чистое черно-белое изображение
  • Как поймать stdout python в c ++-коде
  • Панды оставили внешнее соединение нескольких кадров данных на нескольких столбцах
  • «nosetests» не распознаются в Windows после установки и добавления в PATH
  • Создание нескольких случайных (x, y) координат, исключая дубликаты?
  • Рекурсивная программа Python для простого факторизации числа
  • Масштабирование цели приводит к тому, что Scikit-learn регрессия SVM разбивается
  • Область переменных и Try Catch в python
  • 2 Solutions collect form web for “Разберите CSV-файл и суммируйте значения”

    Протестировано в 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 вверху, чтобы получить правильные результаты.

    Использование dict со значением, поскольку AMOUNT может сделать трюк. Что-то вроде следующего –

    Предположим, что вы читаете одну строку за раз, а 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 .

    Python - лучший язык программирования в мире.