#python #pandas #csv #sum #plotly-python
#python #pandas #csv #сумма #plotly-python
Вопрос:
Я пытаюсь создать график, используя pandas для чтения файла csv и plotly для создания гистограммы на Python.
Данные csv выглядят примерно так (это неверные данные, это пример):
day,month,year,cases,deaths,countriesAndTerritories
11,11,2020,190,230, United_States_of_America
10,11,2020,224,132, United_States_of_America
9,11,2020,80,433, United_States_of_America
8,11,2020,126,623, United_States_of_America
Я успешно создал гистограмму, которая визуализирует количество смертей в месяц, используя этот код:
import pandas as pd
import plotly.express as px
covid_data = pd.read_csv('data/data.csv')
united_states_data = covid_data[covid_data.countriesAndTerritories == 'United_States_of_America']
month_data = united_states_data[['month']]
death_data = united_states_data[['deaths']]
fig = px.bar(united_states_data, x='month', y='deaths', title='COVID-19 deaths by month')
fig.show()
Проблема в том, что для каждого месяца он складывает данные за каждый день друг на друга и показывает белые линии, разделяющие дни. Мне нужны только данные за каждый месяц, меня не волнуют дни. Как бы я поступил по этому поводу? Я подумал, что мне придется каким-то образом создавать новый набор данных для общего количества смертей за каждый месяц, добавляя данные за каждый из дней в одни и те же месяцы вместе?
Ответ №1:
Следующий код должен достичь вашей цели:
df_plot = df.groupby('month', as_index=False).deaths.sum()
fig = px.bar(df_plot, x='month', y='deaths', title='COVID-19 deaths by month')
fig.show()
Комментарии:
1. Вам нужно будет группировать по месяцам, годам и странам, да?
2. Если в анализе больше года и целевой контраст, да! Спасибо, что указали на это!
3. Это намного лучше, чем то, что я сделал, чтобы исправить это, спасибо!
Ответ №2:
Обновление: я нашел решение, которое группирует дни каждого месяца вместе, чтобы создать ежемесячное число погибших.
# create a dict that holds the data I want (set deaths to 0 for now)
monthly_deaths = [
{"month": 1, "name": 'January', "deaths": 0},
{"month": 2, "name": 'February', "deaths": 0},
{"month": 3, "name": 'March', "deaths": 0},
{"month": 4, "name": 'April', "deaths": 0},
{"month": 5, "name": 'May', "deaths": 0},
{"month": 6, "name": 'June', "deaths": 0},
{"month": 7, "name": 'July', "deaths": 0},
{"month": 8, "name": 'August', "deaths": 0},
{"month": 9, "name": 'September', "deaths": 0},
{"month": 10, "name": 'October', "deaths": 0},
{"month": 11, "name": 'November', "deaths": 0},
{"month": 12, "name": 'December', "deaths": 0},
]
# create a data frame of the data I want to use to achieve this
new_data = pd.DataFrame(united_states_data)
# iterate through the rows of the data frame and update the values of the dict
for i, j in new_data.iterrows():
if float(j[['month']]) == 1:
monthly_deaths[0]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 2:
monthly_deaths[1]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 3:
monthly_deaths[2]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 4:
monthly_deaths[3]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 5:
monthly_deaths[4]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 6:
monthly_deaths[5]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 7:
monthly_deaths[6]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 8:
monthly_deaths[7]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 9:
monthly_deaths[8]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 10:
monthly_deaths[9]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 11:
monthly_deaths[10]['deaths'] = int(j[['deaths']])
if float(j[['month']]) == 12:
monthly_deaths[11]['deaths'] = int(j[['deaths']])
# plot the data
fig = px.bar(monthly_deaths, x='name', y='deaths', title='COVID-19 deaths by month')
fig.show()