首页 > 解决方案 > 如何将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

你能帮我弄清楚如何根据这本词典总结某个州的已确认死亡人数吗?

标签: pythoncsvdictionary

解决方案


实际上,我会以不同的方式来做,虽然更冗长但对于查看代码的人来说更具可读性。

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

如果您保持密钥简单(在这种情况下只是状态),那么管理您的代码会更容易。如果您的数据更大,这也会更快,因为我们不必遍历字典中的元组键来获取我们想要的状态。


推荐阅读