Conditional removal of labels in Matplotlib pie chart

The autopct argument from pie can be a callable, which will receive the current percentage. So you only would need to provide a function that returns an empty string for the values you want to omit the percentage.

def my_autopct(pct):
    return ('%.2f' % pct) if pct > 20 else ''

ax.pie(df[col], labels=df.index, autopct=my_autopct, colors=colors)

If you need to parametrize the value on the autopct argument, you'll need a function that returns a function, like:

def autopct_generator(limit):
    def inner_autopct(pct):
        return ('%.2f' % pct) if pct > limit else ''
    return inner_autopct

ax.pie(df[col], labels=df.index, autopct=autopct_generator(20), colors=colors)

For the labels, the best thing I can come up with is using list comprehension:

for ax, col in zip(axes.flat, df.columns):                                                             
    data = df[col]                                                                                     
    labels = [n if v > data.sum() * 0.2 else ''
              for n, v in zip(df.index, data)]                       

    ax.pie(data, autopct=my_autopct, colors=colors, labels=labels)

Note, however, that the legend by default is being generated from the first passed labels, so you'll need to pass all values explicitly to keep it intact.

axes[0, 0].legend(df.index, bbox_to_anchor=(0, 0.5))