2

I have a Pandas data frame that looks like this:

ID  Management   Administrative
1      1              2
3      2              1
4      3              3 
10     1              3

essentially the 1-3 is a grade of low medium or high. I want a stacked bar chart that has Management and Administrative on x-axis and the stacked composition of 1,2,3 of each column in percentages.

e.g. if there were only 4 entries as above, 1 would compose 50% of the height, 2 would compose 25% and 3 would compose 25% of the height of the management bar. The y axis would go up to 100%.

Hope this makes sense. Hard to explain but if unclear willing to clarify further!

user8322222
  • 489
  • 3
  • 14
  • 28
  • It is very unclear to me as I can't see the relation of your explanation to your dataframe. To me, for index 1, Management would compose for 33% and Administrative 66% for instance. – IMCoins Nov 21 '18 at 17:55

1 Answers1

1

You will need to chain several operations: First melt your dataset to move the Department as a new variable, after that you can groupby the Department and the Rating to count the number of IDs that fall into that bucket, then you groupby again by Department to calculate the percentages. Lastly you can plot your stacked bar graph:

df4.melt().rename(columns={'variable':'Dept', 'value':'Rating'}
    ).query('Dept!="ID"'
    ).groupby(['Dept','Rating']).size(
    ).rename('Count'
    ).groupby(level=0).apply(lambda x: x/sum(x)
    ).unstack().plot(kind='bar', stacked=True)

enter image description here

Franco Piccolo
  • 6,845
  • 8
  • 34
  • 52