Я буду использовать кадр данных, который вы указали в своем вопросе
Для первого задания используйте groupby.size
top10=df.groupby('Vendor').size().sort_values(ascending=False).head(10)
print(top10)
Vendor
VendorAB 3
VendorA 2
VendorF 1
dtype: int64
После создания группы по vendors
из top10 (с использованием: DataFrame.isin ) и categories
использование DataFrame.unstack для построения с DataFrame.plot :
top10_by_categories=df[df['Vendor'].isin(top10vendors)].groupby(['Vendor','Category']).count()['Product'].unstack()
categories=top10_by_categories.columns
top10_by_categories['total']=top10_by_categories.sum(axis=1)
top10_by_categories.sort_values(by='total',ascending=False,inplace=True)
print(top10_by_categories)
top10_by_categories[categories].plot(kind='bar',stacked=True)
Category A B C D total
Vendor
VendorAB 2.0 1.0 NaN NaN 3.0
VendorA NaN 1.0 1.0 NaN 2.0
VendorF NaN NaN NaN 1.0 1.0