【问题标题】:How to convert csv file to python dictionary?如何将csv文件转换为python字典?
【发布时间】:2021-12-22 12:27:42
【问题描述】:

我有一个巨大的 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 代表数字确诊病例数,第二个代表确诊死亡人数。

基本上,我想要这样的输出:

dic = {("state","county"):[confirmed_cases, confirmed_deaths]}

请确保排除标题。

如何为 csv 文件中的所有县生成一个类似于上述的 python 字典?请使用csv.reader

此外,我需要找到某个特定州的所有已确认死亡人数的总和。例如,我将如何总结 'state' 为 'Alabama' 的所有行的 'confirmed death' 中的值?

编辑:我想出了解决问题第一部分的方法:

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

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

【问题讨论】:

  • 您可以使用模块csv来节省您的时间。

标签: python csv dictionary


【解决方案1】:

我会建议一本字典。然后更容易按州或县获得总数。我使用了 2 个字典:dd 是 dict 的字典,deaths 是从 dd 字典构建的字典,用于按州获取死亡人数。

import csv
from collections import defaultdict

dd = defaultdict(dict)

with open('csv_11_09_01.csv', 'r') as f:
    reader = csv.DictReader(f)
    for record in reader:
        dd[ record['state'] ][ record['county'] ] = \
           [
               int(record['confirmed_cases']),
               int(record['confirmed_deaths'])
            ]

【讨论】:

    【解决方案2】:

    试试:

    import csv
    
    mydict = dict()
    with open("test.csv") as inp:
        reader = csv.reader(inp)
        next(reader, None) #skip header
        mydict = {tuple(row[2:0:-1]): list(map(int, row[6:8])) for row in reader}
    
    #total of all confirmed deaths in Alabama
    >>> sum(v[1] for k, v in mydict.items() if k[0]=="Alabama")
    890
    
    test.csv:
    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
    

    【讨论】:

    • 谢谢。我如何将每个州的确认死亡数相加?
    • 感谢您的努力,但由于某种原因,您输入的代码无法正常工作。但是,我只是想出了按预期工作的代码: 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
    • 你能根据我的代码想出一个新的求和函数吗?
    • 当我尝试你的字典部分代码时,我不断收到错误消息。但是,我只是想出了一个解决方案来解决我必须从 csv 生成字典的部分问题。我编辑了 OP 以包含它。你能帮我在我的函数创建的字典中找到特定州的确认死亡总数吗?谢谢!
    • @Answersplease - 我的代码对您提供的示例 .csv 没有任何错误。我不知道你遇到了什么错误或如何。此外,如果您的字典结构相同,则获取总和的代码不应更改。这只是我答案的最后一行。请注意,在您的字典中,您正在保存 dic[("county", "state")],但您在帖子中提到您想要 dic[("state", "county")]
    【解决方案3】:

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

    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
    

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

    【讨论】:

      【解决方案4】:

      我认为 pandas 是最合适的解决方案:

      import pandas as pd
      df = pd.read_csv(file_path)
      dict = df.set_index(['county','state'])[['confirmed_cases', 'confirmed_deaths']].apply(tuple, axis = 1).to_dict()
      print(dict)
      

      编辑

      对于总和部分:

      sum = df.groupby(['state'], as_index=False)['confirmed_cases', 'confirmed_deaths'].sum()
      print(sum)
      

      【讨论】:

        猜你喜欢
        • 2018-08-13
        • 2017-09-13
        • 2021-12-18
        • 2020-12-24
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 2023-03-20
        • 2017-03-27
        相关资源
        最近更新 更多