python - 如何将csv文件转换为python字典?
问题描述
我有一个巨大的 csv 文件,其中包含有关美国每个县的 COVID-19 病例和死亡人数的信息。
为了让您大致了解此文件中包含的信息,这里是它的前 10 行:
date,county,state,fips,cases,deaths,confirmed_cases,confirmed_deaths,probable_cases,probable_deaths
2021-03-18,Autauga,Alabama,01001,6483,96,5557,85,926,11
2021-03-18,Baldwin,Alabama,01003,20263,295,14329,220,5934,75
2021-03-18,Barbour,Alabama,01005,2199,54,1225,37,974,17
2021-03-18,Bibb,Alabama,01007,2512,58,2031,35,481,23
2021-03-18,Blount,Alabama,01009,6371,129,4901,109,1470,20
2021-03-18,Bullock,Alabama,01011,1193,39,1059,29,134,10
2021-03-18,Butler,Alabama,01013,2069,66,1888,60,181,6
2021-03-18,Calhoun,Alabama,01015,14137,301,10608,242,3529,59
2021-03-18,Chambers,Alabama,01017,3460,113,1720,73,1740,40
无论如何,我想为这个数据创建一个 Python 字典,每个键都是一个由州和县名称组成的元组,每个值都是一个整数列表:第一个int
表示确诊病例数,第二个1 代表已确认的死亡人数。
基本上,我想要这样的输出:
dic = {("state","county"):[confirmed_cases, confirmed_deaths]}
请确保排除标题。
我如何为 csv 文件中的所有县生成一个像上面那样的 python 字典?请使用csv.reader
.
此外,我需要找到特定州的所有已确认死亡人数的总和。例如,我将如何总结“州”为“阿拉巴马州”的所有行的“确认死亡”中的值?
编辑:我想出了问题的第一部分的解决方案:
mydict = {}
with open(file_path, mode='r') as inp:
reader = csv.reader(inp)
next(reader,None)
mydict = {tuple(row[1:3]):list(row[6:8]) for row in reader}
return mydict
你能帮我弄清楚如何根据这本词典总结某个州的已确认死亡人数吗?
解决方案
实际上,我会以不同的方式来做,虽然更冗长但对于查看代码的人来说更具可读性。
import csv
from collections import namedtuple
County = namedtuple("County", ["name", "cases", "deaths"])
reader = csv.DictReader(data)
for row in reader:
state = row["state"]
county = row["county"]
record = County(county, int(row["confirmed_cases"]), int(row["confirmed_deaths"]))
if state in states:
states[state].append(record)
else:
states[state] = [record]
{'Alabama': [County(name='Autauga', cases=5557, deaths=85),
County(name='Baldwin', cases=14329, deaths=220),
County(name='Barbour', cases=1225, deaths=37),
County(name='Bibb', cases=2031, deaths=35),
County(name='Blount', cases=4901, deaths=109),
County(name='Bullock', cases=1059, deaths=29),
County(name='Butler', cases=1888, deaths=60),
County(name='Calhoun', cases=10608, deaths=242),
County(name='Chambers', cases=1720, deaths=73)]}
sum(county.deaths for county in states["Alabama"])
>> 890
如果您保持密钥简单(在这种情况下只是状态),那么管理您的代码会更容易。如果您的数据更大,这也会更快,因为我们不必遍历字典中的元组键来获取我们想要的状态。
推荐阅读
- java - JPA 继承:MappedSuperclass 还是加入?
- sql - 需要按数据集中的值对第一列进行排序,然后找到平均值
- function - 在 Julia 中绘制函数突然不起作用
- c - 根据包含索引的另一个数组的内容对 C 字符数组进行排序
- scala - 从列表数组中获取元素的位置
- foreach - 创建一个依赖于其他 Rcpp 包的简单 Rcpp 包
- scala - Akka 流批处理
- asp.net - 在 Dapper 中,是否可以在 SQL 数据库中创建 PK 和 FK 关系?
- php - 网站和 REST 客户端之间如何交互
- git - 推送到签出分支并在之后执行 git hook