繁体   English   中英

Pandas groupby 在保留多个聚合的组内排序并使用 facet 可视化

[英]Pandas groupby sort within groups retaining multiple aggregates and visualize it with 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

在此处输入图像描述

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

在此处输入图像描述

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

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

然后你可以 plot 与seaborn.FacetGrid

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

plt.show()

在此处输入图像描述

  • 可视化是关于讲故事,并以清晰简洁的方式呈现数据以传达该故事。 因此,对于每个 plot 具有相同的 xaxis 顺序会更清楚。
    • 查看您的可视化效果的人应该能够快速辨别出哪家商店的哪种产品总销售额最高,但如果每个轴的产品类别顺序不同,则这并不容易
  • 这可以通过pandas.DataFrame.plot通过使用pandas.DataFrame.pivot_table整形数据来完成。
  • 使用python 3.8.11 matplotlib 3.4.2 seaborn 0.11.2pandas 1.3.1进行测试
import pandas as pd
import matplotlib.pyplot as plt

# using the sample data; reshape df
dfp = df.pivot_table(index='product', columns='store', values='sales', aggfunc='sum')

# display(dfp)
store          store1        store2        store3
product                                          
A         9303.543781  15323.422183  20738.561588
B                 NaN   7549.028221           NaN
C        13976.321362  22350.050356   9865.392344
D         6905.455849   3183.767513   6010.941242

# plot
dfp.plot(kind='bar', subplots=True, layout=(1, 3), figsize=(8, 4), legend=False, rot=0,
         sharey=True, title='Store Sales by Product', ylabel='Total Sales')
plt.show()

在此处输入图像描述

  • 这个演示文稿没有子图更清楚(删除subplots=True
    • 更清楚的是,产品 B 仅在商店 2 有销售
dfp.plot(kind='bar', rot=0, figsize=(5, 3), title='Store Sales by Product', ylabel='Total Sales')
plt.show()

在此处输入图像描述

  • 切换indexcolumns的类别讲述了一个不同的故事
dfp = df.pivot_table(index='store', columns='product', values='sales', aggfunc='sum')

dfp.plot(kind='bar', rot=0, figsize=(5, 3), title='Product Sales by Store', ylabel='Total Sales')
plt.show()

在此处输入图像描述

seaborn.catplot

  • 使用.catplot这可以在没有.groupby.pivot_table的情况下完成,因为kind='bar'有一个estimator参数。
  • 使用col=
import seaborn as sns

sns.catplot(kind='bar', data=df, col='store', x='product', y='sales',
            order=sorted(products), col_order=sorted(stores), estimator=sum, ci=False, height=3)
plt.show()

在此处输入图像描述

  • 使用hue=
  • 仅供参考,此 plot 的随机数据 ( df ) 与其他地块不同。
sns.catplot(kind='bar', data=df, hue='store', x='product', y='sales', height=3,
            col_order=sorted(stores), estimator=sum, ci=False, order=sorted(products))
plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM