如何基于两个值比较数据(.csv)文件中的行,然后使用Python汇总数据?

如何基于两个值比较数据(.csv)文件中的行,然后使用Python汇总数据?,python,python-2.7,Python,Python 2.7,我有一个.csv文件,有25列。在此数据中,第18列为人员ID,第19列为捐赠日期。我已经使用Linux对数据进行了预排序,以便所有人的ID都显示在一起,按捐赠日期降序排列 这就是我不确定如何继续的地方。我需要找到所有具有相同人员ID和捐赠日期的行,将各种值相加,然后将一行输出到输出中。所以本质上,文件中的每一行要么是不同的客户,要么是同一客户的不同捐赠日期。最好使用以人名为关键字的字典吗?这在语法上会是什么样子 我是这样想的: with open("file.csv") as csv_file

我有一个.csv文件,有25列。在此数据中,第18列为人员ID,第19列为捐赠日期。我已经使用Linux对数据进行了预排序,以便所有人的ID都显示在一起,按捐赠日期降序排列

这就是我不确定如何继续的地方。我需要找到所有具有相同人员ID和捐赠日期的行,将各种值相加,然后将一行输出到输出中。所以本质上,文件中的每一行要么是不同的客户,要么是同一客户的不同捐赠日期。最好使用以人名为关键字的字典吗?这在语法上会是什么样子

我是这样想的:

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

因为您已经进行了预排序,所以可以将其组织为每个人调用一次函数,每次都使用特定人的行调用函数

由于数据是预先排序的,因此我们假设person 1的行在一起,然后person 2的行(或39,或其他数字)在一起,等等。因此我们需要检测字段18中的person id何时更改。为此,我们使用变量
last\u person
来跟踪我们正在处理的人。变量
row\u 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)

我建议采用面向对象的方法

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()))
这定义了一个
事务
类,其实例包含来自CSV文件的各种字段。然后,它启动一个事务字典并查看CSV文件,将一个新的
事务
对象添加到一个新的bucket(如果给定的ID和日期以前没有见过)或一个现有bucket(如果给定的ID和日期以前见过)


然后,它通过这个字典,对每个bucket进行计算,打印bucket和计算结果。

sqlite本身也可以用于这类任务。因此,有共享
People\u ID的行
,共享
捐赠日期的行
,以及两者都共享的行?您想为
个人ID
捐赠日期
的每个独特组合将您的交易分类到一个单独的bucket中吗?您的文件是否有一个特殊的第一行或标题来命名列?@TigerhawkT3我的输出中的每一行。此预处理的csv文件将打印一张收据。在同一天做出的所有捐赠都应该汇总到一张收据中,而不是打印出倍数(如果有意义的话)。因此,我需要找到一种方法,将共享相同P_ID和Don_日期的行合并为一行。@flybonzai在这种情况下
csv。Dictreader
可能更方便。请参阅---如果您有一个标题行,那么基于SQL的解决方案(如sqlite或mysql)可能比编写代码并调试代码更简单。我唯一想了解的是最后一部分的工作。介意解释一下吗?如果它被称为
current\u person
?我做了编辑。这能充分解释吗?这是一个非常棒的建议,我将在周一的工作中通过你的例子来应用它:)