Построение графика количества уникальных значений в groupby

#python #pandas #matplotlib

#питон #панды #matplotlib

Вопрос:

У меня есть набор данных с этой формой :

 >>> df
         my_timestamp    disease  month
0 2016-01-01 15:00:00       2      jan
0 2016-01-01 11:00:00       1      jan
1 2016-01-02 15:00:00       3      jan  
2 2016-01-03 15:00:00       4      jan  
3 2016-01-04 15:00:00       2      jan  
  

 

Я обычно подсчитываю количество уникальных появлений по месяцам, по значениям, а затем строю график каждого значения по месяцам.

количество значений df
2 января 3 января 2 3

Как я могу его отобразить? На одном графике с месяцем по оси x, одна строка для каждого значения и их количество в y

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

1. можете ли вы попробовать это: df.groupby('month')['disease']nunique().plot()

2. @remc пожалуйста, примите один из ответов в качестве решения, нажав на галочку рядом с моим ответом. Спасибо!

Ответ №1:

Если вы хотите построить график по месяцам, вам также необходимо построить график по годам, если несколько лет. Вы можете использовать dt.strftime при использовании .groupby для группировки по годам и месяцам.

Учитывая следующий слегка измененный набор данных, чтобы включить больше месяцев:

        my_timestamp  disease    month
2016-01-01 15:00:00       2      jan
2016-02-01 11:00:00       1      feb
2017-01-02 15:00:00       3      jan  
2017-01-02 15:00:00       4      jan  
2016-01-04 15:00:00       2      jan  
 

Вы можете выполнить следующее

 df['my_timestamp'] = pd.to_datetime(df['my_timestamp'])
df.groupby(df['my_timestamp'].dt.strftime('%Y-%m'))['disease'].nunique().plot()
 

введите описание изображения здесь

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

1. Это работает, но возвращает количество уникальных значений, а не количество значений.

2. @remc как насчет использования .count() вместо .nunique() ? Вы также можете использовать .size() . Это работает?

3. да! См. мой ответ

Ответ №2:

Что я сделал, чтобы получить эти данные в barplot. Я создал колонку месяца. Затем :

 for v in df.disease.unique():
   diseases = df_cut[df_cut['disease']==v].groupby('month_num')['disease'].count()
   x = diseases.index
   y = diseases.values
   plt.bar(x, y)