Pandas: how to draw a bar with two categories and four series?

I have the following dataframe, where pd.concat used to group columns:

  ab C1 C2 C3 C4 C5 C6 C7 C8 0 15 37 17 10 8 11 19 86 1 39 84 11 5 5 13 9 11 2 10 20 30 51 74 62 56 58 3 88 2 1 3 9 6 0 17 4 17 17 32 24 91 45 63 48 

Now I want to draw a bar chart where I have only two categories ( a and b ), and each category has four bars representing the average value for each column. Columns C1 and C5 should be the same color as columns C2 and C6, and so on.

How to do this with df.plot.bar ()?

The plot should resemble the following image. Sorry to draw it by hand, but it was very difficult for me to find a suitable example: enter image description here

EDIT

This is the title of my actual DataFrame:

  C1 C2 C3 C4 C5 C6 C7 C8 0 34 34 34 34 6 40 13 26 1 19 19 19 19 5 27 12 15 2 100 100 100 100 0 0 0 0 3 0 0 0 0 0 0 0 0 4 100 100 100 100 0 0 0 0 
+5
source share
2 answers

You can simply do unstack after calculating mean for DF to display the bar chart.

 import seaborn as sns sns.set_style('white') #color=0.75(grey) df.mean().unstack().plot.bar(color=list('rbg')+['0.75'], rot=0, figsize=(8,8)) 

Picture


Data: (as per edited post)

 df 

Picture

Prepare the multiindex DF by creating an additional column, repeating the labels according to the column choices (here, 4).

 df_multi_col = df.T.reset_index() df_multi_col['labels'] = np.concatenate((np.repeat('A', 4), np.repeat('B', 4))) df_multi_col.set_index(['labels', 'index'], inplace=True) df_multi_col 

Picture

 df_multi_col.mean(1).unstack().plot.bar(color=list('rbg')+['0.75'], rot=0, figsize=(6,6), width=2) 

Picture

+3
source

Try seaborn

 import seaborn as sns import pandas as pd def r(df): return df.loc[df.name].reset_index(drop=True) data = df.mean().groupby(level=0).apply(r) \ .rename_axis(['grp', 'cat']).reset_index(name='mu') ax = sns.barplot(x='grp', y='mu', hue='cat', data=data) ax.legend_.remove() for i, p in enumerate(ax.patches): height = p.get_height() ax.text(p.get_x() + .05, height + 1, df.columns.levels[1][i]) 

enter image description here

+1
source

Source: https://habr.com/ru/post/1257455/


All Articles