A preparatory step is to convert your DataFrame with a single column
and a MultiIndex into a DataFrame with "normal" index and a separate
column for each category:
df2 = df.Profitability.unstack()
Or if source of your data is a Series (not a DataFrame), then run:
df2 = q1.unstack()
The result, better fit as a figure source, is:
Category Cosmetics First Aid Magazine Supplements Toiletries
Month
1 2685.9000 2128.020 703.89 37005.62 1893.06
2 2569.0600 3282.785 679.11 36647.88 1357.75
3 1350.7925 2238.310 371.12 21444.09 1226.16
To draw the figure, the basic approach is to take linear scale of y axis.
The code to draw it is:
ax = df2.plot.bar(rot=0)
ax.get_figure().suptitle(t='Profitability', fontsize=20)
ax.legend(bbox_to_anchor=(1.35, 1.0));
The last instruction "moves" the legend a bit to the right (compared
to its default location), otherwise it would obscure some bars (try to draw
without this instruction).
The result is:

Note however that bars for Suppelements are very high, compared to
other categories, which are very low.
This is why I came up with the second solution, based on logatithmic scale
of y axis:
ax = df2.plot.bar(rot=0, logy=True)
ax.get_figure().suptitle(t='Profitability', fontsize=20)
ax.legend(bbox_to_anchor=(1.1, 1.0))
yTicks = [1000, 3000, 10000, 30000]
yTickLabels = [ f'{i:,}' for i in yTicks ]
ax.set_yticks(yTicks)
ax.set_yticklabels(yTickLabels);
Last 4 instructions change the default ticks on y axis, as in my
opinion they are better readable that the default ticks (try to draw
a figure without these 4 lines for comparison).
The result is:

Now heigths of bars are easier to compare and y ticks are chosen roughly
on tick(n-1) * 3 basis.
Edit
If you want to have the legend with a title, add title='Category'
parameter to ax.legend(...) instruction, whichever of the above
solutions you choose.