Как сгруппировать и построить значения гистограммы matplotlib - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь group все values в months и plot как bar chart.Ниже то, что я пробовал до сих пор:

import pandas as pd

d1 = ({
    'Date' : ['1/7/18','1/7/18','1/8/18','1/8/18','1/9/18'],     
    'Value' : ['Foo','Bar','Foo','Bar','Foo'],           
    })

df1 = pd.DataFrame(data = d1)

df1['Date'] = pd.to_datetime(df1['Date'])
df1.set_index('Date', inplace = True)
df1.resample('1M').count()['Value'].plot(kind = 'bar')

Но это дает только one bar с count из 5.Я надеюсь, что предполагаемый результат будет 3 отдельный bars.A count из 2 для July, 2 для August и 1 для September.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Ваш код работает отлично, но вы перепутали формат дня / месяца

Все, что вам нужно сделать, это изменить

'Date' : ['1/7/18','1/7/18','1/8/18','1/8/18','1/9/18'], 

на

'Date' : ['7/1/18','7/1/18','8/1/18','8/1/18','9/1/18'],
0 голосов
/ 05 октября 2018

Другим решением было бы использование сводной таблицы для группировки по датам.

pd.pivot_table(df1, values='Value', index='Date', aggfunc='count').plot(kind='bar')
0 голосов
/ 05 октября 2018

Проблема заключается в преобразовании в даты и время, необходимо установить формат или dayfirst=True, потому что DD/MM/YY:

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y')

Или:

df1['Date'] = pd.to_datetime(df1['Date'], dayfirst=True)

И если необходимо построить график по названиям месяцевиспользуйте:

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y').dt.month_name()
#alternative
#df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y').dt.strftime('%B')
df1.groupby('Date')['Value'].count().plot(kind = 'bar')

g

При необходимости правильного заказа месяцев:

months = ['January','February','March','April','May','June','July','August',
          'September','October','November','December']

df1['Date'] = pd.Categorical(df1['Date'], categories=months, ordered=True)
df1.groupby('Date')['Value'].count().plot(kind = 'bar')

g1

Если хотите отфильтровать 0 значения:

df1.groupby('Date')['Value'].count().pipe(lambda x: x[x != 0]).plot(kind = 'bar')

g2

Спасибо @asongtoruin за другую идею:

df1['Date'] = pd.to_datetime(df1['Date'], format='%d/%m/%y') 
#if necessary sorting datetimes
#df1 = df1.sort_values('Date')

df1['month_name'] = df1['Date'].dt.month_name()

df1.groupby('Date').agg({'Value': 'count', 'month_name': 'first'})
                   .plot(x='month_name', y='Value', kind='bar')
...