Сравнение Python CSV с умножением

Я хочу дважды проверить свою логику того, как собрать это вместе в Python, поэтому примеры приветствуются.

Мне нужно сравнить 2 файла CSV (тот же формат, точно с 2 строками и 6 столбцами) и показать разницу.

Мне нужно вывести и умножить строку 2, столбцы 2-6 на определенные значения (5), суммировать их отдельно, а затем сравнить друг с другом (всего CSV2 / CSV1 всего) и представить в процентном формате.

import csv и reader кажутся подходящими, но сложная часть для меня заключалась в том, чтобы вытащить его в список, который я могу умножить на разные значения (или мне следует использовать коллекцию?), а затем сравнить их в самом кратком / эффективным способом.

Обновление кода (на основе 2-го ответа - было здорово, спасибо! Но теперь возникает ошибка при вызове целых чисел значений моей строки):

import csv
file1 = open('csv1.csv', 'rb')
csv1 = csv.DictReader(file1)

file2 = open('csv2.csv', 'rb')
csv2 = csv.DictReader(file2)


myList = csv2.fieldnames
myList.append('Difference')

outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)

file1Dict = dict()
file2Dict = dict()

for row in file1:
    file1Dict[row['key value']]['Total1'] = {'Total1':(int(row[1]) * .75 + int(row[2]) * 2.25 + int(row[3]) * 3.5 + int(row[4]) * 5 + int(row[5]) * 25)}

for row in file2:
    file2Dict[row['key value']]['Total2'] = {'Total2':(int(row[1]) * .75, int(row[2]) * 2.25, int(row[3]) * 3.5, int(row[4]) * 5, int(row[5]) * 25)}

outFile.writeheader()

for stuff in file1Dict:
    file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
    outFile.writerow(file1Dict[stuff])

print 'difference'

person user2004850    schedule 23.01.2013    source источник
comment
Добро пожаловать в StackOverflow! Почему бы вам не показать код, который вы пробовали до сих пор?   -  person David Robinson    schedule 23.01.2013
comment
Также было бы неплохо увидеть пример ввода и ожидаемый результат.   -  person root    schedule 23.01.2013
comment
Это может вам помочь, help.hackshackers.com/questions/   -  person MGP    schedule 23.01.2013


Ответы (2)


Я думаю, вам следует использовать Python Pandas и встроенный _ 1_, так как это будет очень эффективно и превратит ее в прямоугольную форму, где любой вид математических операций просты в применении и легко сравниваются между двумя разными импортированными наборами данных.

Обратите внимание, что после импорта pandas существует глобальный уровень read_csv, который называется так же pandas.read_csv("/path/to/file.csv"), вместо того, чтобы проходить через io.parsers, как на связанной странице документа выше.

Нет ничего плохого в том, чтобы делать это через стандартные модули; Я просто думаю, что если вы планируете выполнять агрегированные или широковещательные математические операции, прямоугольный массив, предоставляемый Pandas, который использует эффективные математические операции NumPy, является лучшим выбором.

person ely    schedule 23.01.2013
comment
Панды кажутся крутыми, хотя я получаю эту ошибку (v 2.7 как для python, так и для Pandas): Traceback (последний вызов последним): файл C: / Python27 / budget, строка 1, в ‹module› import pandas File C: \ Python27 \ lib \ site-packages \ pandas_ init_ .py, строка 6, в ‹module› от. import hashtable, tslib, lib Файл tslib.pyx, строка 25, в init pandas.tslib (pandas \ tslib.c: 37082) ImportError: нет модуля с именем dateutil.parser - person user2004850; 23.01.2013
comment
Кажется, это характерно для вашей системы, я использую Python 2.7.3 (также нет версии 2.7 Pandas, поэтому я не уверен, о какой версии вы имеете в виду ... вы имеете в виду 0.2.7? Если да , он очень старый, и маловероятно, что вы его используете, потому что вам действительно придется изо всех сил, чтобы получить такую ​​старую версию). Для меня dateutil.parser - допустимый модуль, который я могу импортировать. - person ely; 24.01.2013
comment
Спасибо за совет! Я уверен, что у меня просто не та версия. :) В восторге от возможности узнать больше о пандах. - person user2004850; 24.01.2013

import csv
file1 = open('filename1.csv', 'rb')
csv1 = csv.DictReader(file1)

file2 = open('filename2.csv', 'rb')
csv2 = csv.DictReader(file2)


myList = csv2.fieldnames
myList.append('Total1','Total2', 'Difference')

outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)

file1Dict = dict()
file2Dict = dict()

for rows in file1:
    file1Dict[rows['key value']] = {rows[0], rows[1], 'Total1':int(rows[1]) * 5}

for rows in file2:
    file1Dict[rows['key value']]['Total2'] = {'Total2':int(rows[1]) * 5}

outFile.writeheader()

for stuff in file1Dict:
    file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
    outFile.writerow(file1Dict[stuff])

Просто быстрое объединение того, что вы описали, без нестандартных модулей.

person user2005227    schedule 23.01.2013
comment
Спасибо! Я фактически переключился на то, что вы предложили, потому что мне это очень понравилось, с некоторыми обновлениями (каждое число нужно умножать на другое значение). Теперь я получаю недопустимый литерал ошибки для int () с базой 10: 'e', ​​когда я должен нажимать целые числа в csv. Мысли? Код обновлен выше. - person user2004850; 24.01.2013