График данных линейного типа не отображается

#python #dataframe #dataset

#python #dataframe #набор данных

Вопрос:

Есть этот набор данных, который я собираюсь построить (его можно получить здесь https://www.kaggle.com/russellyates88/suicide-rates-overview-1985-to-2016 ). Я хотел отобразить suicides_no для мужчин и женщин 25-34 лет в Российской Федерации с 2000 по 2015 год. Поэтому я создаю для этого новый фрейм данных.

Вот основной фрейм данных.

 DF = pd.read_csv("D:/who_suicide_statistics.csv")
  

Вот мой код для создания нового фрейма данных.

 DF1 = (DF.loc[(DF["country"] == "Russian Federation") amp; (DF["age"] == "25-34 years") 
        amp; (DF["sex"] == "male") amp; (DF["year"] >= 2000)])
DF2 = (DF.loc[(DF["country"] == "Russian Federation") amp; (DF["age"] == "25-34 years") 
        amp; (DF["sex"] == "female") amp; (DF["year"] >= 2000)])

year_sex_suicides = {}
year_sex_suicides["year"] = DF1["year"]
year_sex_suicides["male_suicides"] = DF1["suicides_no"]
year_sex_suicides["female_suicides"] = DF2["suicides_no"]
DF333 = pd.DataFrame(data=year_sex_suicides)
  

И вот код для графика, который я хотел.

 DF333.plot(kind="line", x="year", y=["male suicides", "female_suicides"])
  

График, который я придумал, таков

график

Что-то не так, но я не смог это найти.

Ответ №1:

Вероятно, у вас есть довольно много NaN данных в наборе данных, который вы пытаетесь построить (посмотрите на свой фрейм данных, например, оценив print(DF333) ).

Вы могли бы либо заполнить их, используя что-то вроде (хотя это не очень хороший способ!):

 DF333.fillna(method='ffill', inplace=True)
  

Или сбросьте индекс при построении вашего фрейма данных:

 DF1 = (DF.loc[(DF["country"] == "Russian Federation") amp; (DF["age"] == "25-34 years") 
        amp; (DF["sex"] == "male") amp; (DF["year"] >= 2000)])
DF1 = DF1.set_index('year')
DF2 = (DF.loc[(DF["country"] == "Russian Federation") amp; (DF["age"] == "25-34 years") 
        amp; (DF["sex"] == "female") amp; (DF["year"] >= 2000)])
DF2 = DF2.set_index('year')

year_sex_suicides = {}
year_sex_suicides["male_suicides"] = DF1["suicides_no"]
year_sex_suicides["female_suicides"] = DF2["suicides_no"]
DF333 = pd.DataFrame(data=year_sex_suicides)

DF333.plot(kind="line", y=["male_suicides", "female_suicides"])
  

Таким образом, вы гарантируете, что все помещено в строку, соответствующую году, а не индексу строки из исходного файла CSV. Конечно, вы также могли бы использовать что-то вроде groupby от Panda’s, что также уменьшит количество строк кода (но, возможно, вам понадобится DF1 и т.д. Позже для других целей):

 DF1 = DF.loc[(DF["country"] == "Russian Federation") amp; (DF["age"] == "25-34 years")  
       amp; (DF["year"] >= 2000)]
DF1.groupby(['year', 'sex']).sum()['suicides_no'].groupby('sex').plot()