将 csv 的某些列转换为总和字典

Posted

技术标签:

【中文标题】将 csv 的某些列转换为总和字典【英文标题】:Convert certain columns of csv into dictionary of sums 【发布时间】:2016-05-23 12:25:49 【问题描述】:

我有一个从这个网站获得的大 csv 文件:https://data.baltimorecity.gov/Public-Safety/BPD-Part-1-Victim-Based-Crime-Data/wsfq-mvij。

该文件包含在巴尔的摩发生的罪行的信息。 我需要一个函数来读取所有的 CrimeDate 日期,并将每个日期的总事件加起来,这样我就可以获得这样的字典,例如:

[CrimeDate: 05/14/2016, Total Incidents: 50, CrimeDate: 05/13/2016, Total Incidents: 67.........]

请注意,Total Incidents 是我选择的一个随机数,仅用作示例。

输出需要包含日期以及每个日期的事件总数。 我知道如何将csv文件转换为字典,但是由于这个文件很大,需要很长时间才能读取,所以我只想读取我需要的字段。

【问题讨论】:

您可以将 CSV 加载到 pandas 数据框中并删除不需要的列 我无法更改 CSV 文件,它必须保持原样。 不是我说的。您保留 CSV,但将其加载到数据框中,并从数据框中删除列 【参考方案1】:

一次读取 csv 文件一行,然后只将您想要的部分保存在新的字典列表中。

with open('eggs.csv') as csvfile:
    myreader = csv.DictReader(csvfile)
    mydata = [ "CrimeDate": row["CrimeDate"], "Total Incidents": row["Total Incidents"]
               for row in myreader ]

编辑:因为您真正的问题是关于分组汇总列,所以这是一个很好的方法。 (我还编辑了您的问题,以便它询问您真正想要的内容。)

此代码使用itertools.groupby 对具有相同日期的每组记录进行分组,然后对每个组取TotalIncidents 的总和。这取决于按日期对记录进行排序,以便每个总和的记录一起显示。

with open('eggs.csv') as csvfile:
    myreader = csv.DictReader(csvfile)
    grouped_rows = itertools.groupby(myreader, lambda r: r["CrimeDate"])
    totals = list((date, sum(int(r["TotalIncidents"]) for r in grp) 
                  for date, grp in grouped_rows)

print(totals)

如果您确实想要的话,我会留给您将日期和总和的最终列表转换为字典列表。

【讨论】:

它给了我 TypeError: dict 最多期望 1 个参数,得到 2 个 糟糕,忘记了一组括号,抱歉!现已修复 实际上 Python 2.7 允许“dict literals”。现在更具可读性。 我想我明白了,非常有帮助:) 很抱歉我的问题被误解了,我想要的输出是所有事件的总结,这段代码只给了我“犯罪日期”和“总事件”,但它们都是分开的,甚至日期相同的,我需要把同一天发生的事件都总结一下。

以上是关于将 csv 的某些列转换为总和字典的主要内容,如果未能解决你的问题,请参考以下文章

如何将CSV文件转换为python字典

C# 将字典转换为类似字符串的 CSV

将具有 nan 值的 str 类型字典转换为字典类型对象

如何自动将csv转换为pandas?

将 Parquet 转换为 CSV

将字典转换为 CSV 文件 [重复]