2015-07-17 1 views
0

У меня есть CSV-файл с 25 столбцами. В этих данных столбец 18 является идентификатором People_ID, а столбец 19 является датой пожертвования. Я предварительно отсортировал данные с помощью Linux, чтобы все идентификаторы людей отображались вместе, отсортированные по дате пожертвования в порядке убывания.Как сравнить строки в файле данных (.csv) на основе двух значений, а затем свертывать данные с помощью Python?

Здесь я не уверен, как действовать. Мне нужно найти все строки, которые имеют одинаковые People_ID и Дата пожертвования, суммировать различные значения, а затем выводить одну строку в вывод. Таким образом, каждая строка в файле будет либо другим клиентом, либо другой датой пожертвования одним и тем же клиентом. Было бы лучше использовать словарь, используя People_ID в качестве ключа? Как это выглядит синтаксически?

Я думал, что-то вроде этого:

with open("file.csv") as csv_file: 
for row in csv.reader(csv_file, delimiter=','): 
    if row[18] in data_dict: 
     # something something 
+0

sqlite сам по себе также может быть полезен для такого рода задач. – Paul

+0

Итак, есть линии, которые разделяют «People_ID», линии, которые делят «Дату пожертвования», и строки, которые разделяют оба? И вы хотите отсортировать транзакции в отдельном ведре для каждой уникальной комбинации «People_ID» и «Дата пожертвования»? – TigerhawkT3

+0

Имеет ли ваш файл специальную первую строку или заголовок, который называет столбцы? – Paul

ответ

1

Поскольку вы предварительно отсортирован, то можно было бы организовать для вызова функции один раз на человека, каждый раз, когда вызывается с рядами для конкретного человека.

Поскольку данные предварительно отсортированы, мы предполагаем, что строки для человека 1 вместе, а затем строки для человека 2 (или 39 или некоторые другие номера) и т. Д. Поэтому нам необходимо определить, когда идентификатор лица в поле 18 изменяется. Для этого мы используем переменную last_person для отслеживания того, чье лицо мы обрабатываем. Переменная row_cache будет собирать строки для одного человека.

def process_person(rows): 
    if len(rows)==0: 
     return 
    # do something with the rows for this person 
    # and print the result somewhere useful 

last_person = 0 
row_cache = [] 
with open("file.csv") as csv_file: 
for row in csv.reader(csv_file, delimiter=','): 
    if row[18]==last_person: 
     row_cache.append(row) 
    else: 
     process_person(row_cache) 
     row_cache = [row] 
     last_person = row[18] 
process_person(row_cache) 
+0

Только часть, с которой я пытаюсь следовать, это то, что делает часть last_person. Разум объясняет это? – flybonzai

+0

Может быть, если это называется 'current_person'? Я сделал редактирование. Это объясняет это должным образом? – Paul

1

Я бы рекомендовал объектно-ориентированный подход.

import csv 

class Transaction: 
    def __init__(self, fields): 
     self.name, self.age, self.car, self.ident = fields # whatever fields you have 
     # keep in mind these are all strings, 
     # so you may need to process them before analysis 
    def calculation(self): 
     return self.age + self.id 

transactions = {} 
with open('csv_file.csv', newline='') as f: 
    for row in csv.reader(f): 
     bucket = tuple(row[18:20]) 
     if bucket in transactions: 
      transactions[bucket].append(Transaction(row)) 
     else: 
      transactions[bucket] = [Transaction(row)] 

for bucket in transactions: 
    print(bucket, sum(item.amount for item in bucket.values())) 

Это определяет Transaction класс, экземпляры которого содержат различные поля, которые будут приходить из файла CSV. Затем он запускает словарь транзакций и просматривает CSV-файл, добавляя новый объект Transaction в новое ведро (если данный идентификатор и дата не были замечены раньше) или в существующее ведро (если данный идентификатор и дата имеют были замечены раньше).

Затем он проходит через этот словарь и выполняет расчет для каждого ведра, печатает ведро и результат вычисления.

+0

Это потрясающее предложение, я буду проходить ваш пример на работе в понедельник, чтобы применить это :) – flybonzai

Смежные вопросы