The solution, without accessing the DataFrame, should use the patches attribute:
ax = df.plot.bar(title="Scores") for p in ax.patches: ax.annotate(str(p.get_height()), xy=(p.get_x(), p.get_height()))
Note that you need to play with xy kwarg (2nd argument) to get the desired label position.
Vertical bars
I found this formatting to be the best overall:
ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points')
Horizontal bars
I found the following format to work well with horizontal stripes:
ax.annotate("%.2f" % p.get_width(), (p.get_x() + p.get_width(), p.get_y()), xytext=(5, 10), textcoords='offset points')
ksindi
source share