首页 > 解决方案 > Pandas groupby 在保留多个聚合的组内排序并用 facet 可视化它

问题描述

我有这个示例数据集

products = ["A", "B", "C", "D"]
stores = ["store1", "store2", "store3"]
n = 30

product_list = [products[i] for i in np.random.randint(0, len(products), n)]
store_list = [stores[i] for i in np.random.randint(0, len(stores), n)]
rating_list = np.random.random(n) * 5
sales_list = np.random.random(n) * 10000

df = pd.DataFrame(
    {'store': store_list, 
     'product': product_list, 
     'sales': sales_list, 
     'rating': rating_list})

然后总结销售额

df_1=df.groupby(['store','product']).agg({'sales':['sum']})
df_1

在此处输入图像描述

并在维护商店的同时以最高销售额订购

df_2 = df_1.groupby(level=0, group_keys=False).apply(
                   lambda x: x.sort_values(('sales', 'sum'), ascending=False))
df_2

在此处输入图像描述

我怎样才能按商店分面,所以生成的可视化如下所示?

在此处输入图像描述

标签: pythonpandasdataframematplotlibseaborn

解决方案


您应该重置最后一段中的索引:

df_2 = df_1.groupby(level=0, group_keys=False).apply(
                   lambda x: x.sort_values(('sales', 'sum'), ascending=False)).reset_index()

然后你可以用seaborn.FacetGrid

g = sns.FacetGrid(df_2, col = 'store')
g.map(sns.barplot, 'product', 'sales')

plt.show()

在此处输入图像描述


推荐阅读