Home > Mobile >  Histogram of dataframe on column groupby
Histogram of dataframe on column groupby

Time:06-01

Suppose I have the following df:

df
   user      start                end           mode
0   82  2009-04-19 05:49:50 2009-04-19 06:17:40 metro
1   82  2009-04-19 06:18:05 2009-04-19 06:22:44 foot
2   10  2007-06-26 11:32:29 2007-06-26 11:40:29 bus
3   10  2008-03-28 14:52:54 2008-03-28 15:59:59 metro
4   20  2011-08-27 06:13:01 2011-08-27 08:01:37 foot
5   20  2012-02-20 14:10:33 2012-02-20 14:29:59 bus
6   20  2012-02-21 01:22:05 2012-02-21 01:55:47 bus

So I want group my df by mode column and plot histogram for (year, month) showing how many of each mode are there in that month of that year.

So I do:

df[['mode']].groupby([df['start'].dt.year, df['start'].dt.month]).count().plot(kind='barh')

output: enter image description here

The result is cumulative value of mode for each month.

But I want to see the number of each mode (where available) in every month of each year.

CodePudding user response:

You could use seaborn and pass the hue paramter.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'user': [82, 82, 10, 10, 20, 20, 20],
 'start': ['2009-04-19 05:49:50',
  '2009-04-19 06:18:05',
  '2007-06-26 11:32:29',
  '2008-03-28 14:52:54',
  '2011-08-27 06:13:01',
  '2012-02-20 14:10:33',
  '2012-02-21 01:22:05'],
 'end': ['2009-04-19 06:17:40',
  '2009-04-19 06:22:44',
  '2007-06-26 11:40:29',
  '2008-03-28 15:59:59',
  '2011-08-27 08:01:37',
  '2012-02-20 14:29:59',
  '2012-02-21 01:55:47'],
 'mode': ['metro', 'foot', 'bus', 'metro', 'foot', 'bus', 'bus']})


df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])


df['year'] = df.start.dt.year
df['month'] = df.start.dt.month
df = df.groupby(['year','month','mode']).size().reset_index().rename(columns={0:'count'})
g = sns.barplot(data=df, y=df['year'].astype(str) ',' df['month'].astype(str),x='count', hue='mode', orient='h')
plt.ylim(reversed(plt.ylim()));

enter image description here

  • Related