如何用Pandas制作按总销售额排序的公司-产品堆叠条形图
解决堆叠条形图+按总销售额排序的需求
嘿,我明白你想要的效果——既能看到每家公司各产品的销售额堆叠情况,又能让公司按总销售额从高到低排列,同时还不丢失产品信息对吧?之前的groupby只算总销售额确实会丢掉产品维度,咱们换个思路来处理:
第一步:先把你的示例数据构造出来(方便复现)
import pandas as pd import matplotlib.pyplot as plt # 构造你的原始DataFrame data = { 'Company': ['Com1', 'Com2', 'Com1', 'Com3'], 'Product': ['Prod1', 'Prod1', 'Prod2', 'Prod1'], 'Sale Amount': ['$100', '$30', '$120', '$90'], 'Transaction': ['T1', 'T2', 'T3', 'T4'] } pandaFrame = pd.DataFrame(data) # 先把销售额转换成数值类型(去掉$符号) pandaFrame['Sale Amount'] = pandaFrame['Sale Amount'].str.replace('$', '').astype(float)
第二步:确定公司的排序顺序(按总销售额从高到低)
先计算每家公司的总销售额,然后提取排序后的公司名称列表,后续用这个列表来调整图表的X轴顺序:
# 计算每家公司总销售额并排序 company_total = pandaFrame.groupby('Company')['Sale Amount'].sum().sort_values(ascending=False) # 提取排序后的公司名称 sorted_companies = company_total.index.tolist()
第三步:重构数据为透视表(保留产品维度)
用透视表把数据转换成「行=公司,列=产品,值=销售额求和」的格式,这样每个公司的每个产品销售额都能保留:
# 构建透视表,按公司和产品求和销售额 sales_pivot = pandaFrame.pivot_table( index='Company', columns='Product', values='Sale Amount', aggfunc='sum', fill_value=0 # 没有销售的产品填0 ) # 按照之前的总销售额排序顺序重新排列行 sales_pivot = sales_pivot.loc[sorted_companies]
第四步:绘制堆叠条形图
现在直接用pandas的plot方法就能生成堆叠条形图了:
# 绘制堆叠条形图 sales_pivot.plot(kind='bar', stacked=True, figsize=(10, 6)) # 添加图表标签和标题 plt.xlabel('Company') plt.ylabel('Total Sales Amount') plt.title('Stacked Sales by Company and Product (Sorted by Total Sales)') plt.legend(title='Product') plt.show()
这样出来的图表就完全符合你的需求了:X轴是按总销售额从高到低排列的公司,每个条形是该公司各产品销售额的堆叠,能清晰看到每家公司内部各产品的贡献占比~
内容的提问来源于stack exchange,提问作者Adam Marciniak
相关产品推荐
相关产品推荐

