使用Pandas根据值的总和制作堆积条形图

时间:2018-05-29 22:00:07

标签: pandas

我有一个如下所示的数据框:

 Company      Product     Sale Amount   Transaction
1 Com1        Prod1       $100            T1
2 Com2        Prod1       $30             T2
3 Com1        Prod2       $120            T3
4 Com3        Prod1       $90             T4

我想将每家公司的销售金额和公司的销售额与x轴上的公司和y轴上的销售额相加。但是,我希望酒吧是一个堆叠的酒吧,每个单独的堆栈是一个销售的产品。我想这样排序,所以最高的销售额将首先出现并下降。

所以基本上,我能够看到以条形式出售给公司的一堆产品。

目前,我可以打印出每个公司的总销售总额,如下所示:

salesTotal=pandaFrame.groupby(['Company Name'])['Sales Amount'].sum().reset_index()
salesTotal.sort_index(inplace=True)
salesTotal = salesTotal.sort_values(by=['Sales Amount'], ascending=False)

但这给了我一个单独的数据框并丢失了产品信息。

1 个答案:

答案 0 :(得分:0)

假设只有两种产品:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Setting up
Company = ['Com' + str(i) for i in list(np.random.randint(1, 15, 30))]
Product = ['Prod' + str(i) for i in list(np.random.randint(1, 3, 30))]
Sales = np.random.randint(30, 200, 30)
df = pd.DataFrame({'Company': Company, 'Product': Product, 'Sales': Sales})

# Solution
df_1 = df.groupby(['Company', 'Product'])['Sales'].sum()
df_1 = df_1.unstack().fillna(0)
df_1['Total_Sales'] = df_1['Prod1'].add(df_1['Prod2'])
df_1 = df_1.sort_values('Total_Sales', ascending=False)[:10]

df_1.iloc[:, :2].plot(kind='bar', stacked=True)
plt.ylabel('Sales Amount, $')
plt.show()

enter image description here