Как конвертировать csv-файл в словарь python?

#python #csv #dictionary

Вопрос:

У меня есть огромный 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]}  

Пожалуйста, не забудьте исключить заголовок.

Как бы я сгенерировал словарь python, подобный приведенному выше, для всех округов в файле csv? Пожалуйста, используйте 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  

Можете ли вы помочь мне понять, как суммировать подтвержденные смерти в определенном штате на основе этого словаря?

Комментарии:

1. Вы можете использовать модуль csv , чтобы сэкономить свое время.

Ответ №1:

Я думаю, что панды-самое подходящее решение:

 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)  

Ответ №2:

На самом деле я бы сделал это по-другому, хотя и немного более подробно, но более читабельно для тех, кто смотрит на код.

 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"]) gt;gt; 890  

Управлять вашим кодом будет проще, если вы будете сохранять ключ простым, в данном случае просто состояние. Это также будет быстрее, если ваши данные будут больше, так как нам не придется перебирать ключи кортежей в словаре, чтобы получить желаемое состояние.

Ответ №3:

Попробуй:

 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 gt;gt;gt; sum(v[1] for k, v in mydict.items() if k[0]=="Alabama") 890  
тест.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  

Комментарии:

1. Спасибо. Как бы я суммировал подтвержденные смерти для каждого состояния?

2. Спасибо за ваши усилия, но по какой-то причине код, который вы ввели, не работает. Тем не менее, я только что придумал код, который работает так,как я и предполагал: mydict = {} с открытым(путь к файлу, режим=’r’) как inp: reader = csv.reader(inp) следующий(читатель, нет) mydict = {кортеж(строка[1:3]):список(строка[6:8]) для строки в reader} возвращает mydict

3. Не могли бы вы, пожалуйста, придумать новую функцию суммирования на основе моего кода?

4. Когда я попробовал ваш код для части словаря, я продолжал получать сообщения об ошибках. Тем не менее, я только что нашел решение той части проблемы, в которой мне нужно создать словарь из csv. Я отредактировал ОП, чтобы включить его. Не могли бы вы помочь мне найти сумму подтвержденных смертей для определенного штата в словаре, созданном моей функцией? Спасибо!

5. @Answersplease — Мой код не выдает ошибок с предоставленным вами образцом .csv. Я понятия не имею, какие ошибки вы получаете и как. Кроме того, код для получения суммы не должен меняться, если структура вашего словаря одинакова. Это всего лишь последняя строка моего ответа. Обратите внимание, что в своем словаре вы сохраняете dic[("county", "state")] , но в своем посте вы упомянули, что хотите dic[("state", "county")]

Ответ №4:

Я бы предложил словарь словарей. Затем становится легче получить итоговые данные по штату или округу. Я использовал 2 словаря: dd это дикт дикта и 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'])  ]