#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']) ]