如何基于两个值比较数据(.csv)文件中的行,然后使用Python汇总数据?
我有一个.csv文件,有25列。在此数据中,第18列为人员ID,第19列为捐赠日期。我已经使用Linux对数据进行了预排序,以便所有人的ID都显示在一起,按捐赠日期降序排列 这就是我不确定如何继续的地方。我需要找到所有具有相同人员ID和捐赠日期的行,将各种值相加,然后将一行输出到输出中。所以本质上,文件中的每一行要么是不同的客户,要么是同一客户的不同捐赠日期。最好使用以人名为关键字的字典吗?这在语法上会是什么样子 我是这样想的:如何基于两个值比较数据(.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
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
?我做了编辑。这能充分解释吗?这是一个非常棒的建议,我将在周一的工作中通过你的例子来应用它:)