Pandas Dataframe to Seaborn Grouped Barchart Pandas Dataframe to Seaborn Grouped Barchart pandas pandas

Pandas Dataframe to Seaborn Grouped Barchart


The trick is to transform the pandas df from wide to long format

Step 1: Prepare data

import seaborn as snsnp.random.seed(123)index = np.random.randint(1,100,10)x1 = pd.date_range('2000-01-01','2015-01-01').map(lambda t: t.strftime('%Y-%m-%d'))dts = np.random.choice(x1,10)benchmark = np.random.randn(10)portfolio = np.random.randn(10)df = pd.DataFrame({'Index': index,                   'Dates': dts,                   'Benchmark': benchmark,                   'Portfolio': portfolio},                    columns = ['Index','Dates','Benchmark','Portfolio'])

Step 2: From "wide" to "long" format

df1 = pd.melt(df, id_vars=['Index','Dates']).sort_values(['variable','value'])df1    Index   Dates   variable    value9   48  2012-06-13  Benchmark   -1.4103011   93  2002-07-31  Benchmark   -1.3014898   97  2005-01-21  Benchmark   -1.1009850   67  2011-06-01  Benchmark   0.1265264   84  2003-09-25  Benchmark   0.4656453   18  2009-07-13  Benchmark   0.5227425   58  2007-12-04  Benchmark   0.7249157   98  2002-12-28  Benchmark   0.7465816   87  2009-02-07  Benchmark   1.4958272   99  2000-04-21  Benchmark   2.20742716  87  2009-02-07  Portfolio   -2.75022414  84  2003-09-25  Portfolio   -1.85563715  58  2007-12-04  Portfolio   -1.77945519  48  2012-06-13  Portfolio   -1.77413411  93  2002-07-31  Portfolio   -0.98486812  99  2000-04-21  Portfolio   -0.74856910  67  2011-06-01  Portfolio   -0.74765118  97  2005-01-21  Portfolio   -0.69598117  98  2002-12-28  Portfolio   -0.23415813  18  2009-07-13  Portfolio   0.240367

Step 3: Plot

sns.barplot(x='Dates', y='value', hue='variable', data=df1)plt.xticks(rotation=90)plt.ylabel('Returns')plt.title('Portfolio vs Benchmark Returns');

enter image description here