使用Pandas基于值之和生成堆叠条形图

使用Pandas基于值之和生成堆叠条形图,pandas,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 s

我有一个数据框,看起来像这样:

 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
salesTotal=pandaFrame.groupby(['Company Name'])['Sales Amount'].sum().reset_index()
salesTotal.sort_index(inplace=True)
salesTotal = salesTotal.sort_values(by=['Sales Amount'], ascending=False)
我想把每个公司的销售额加起来,然后把它放在一个条形图中,公司在x轴上,销售额在y轴上。但是,我希望这个酒吧是一个堆叠的酒吧,每个单独的堆叠都是一个出售的产品。我想把它分类,这样最高的销售额会先出现然后下降

所以基本上,我可以看到一堆产品以酒吧的形式卖给一家公司

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

 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
salesTotal=pandaFrame.groupby(['Company Name'])['Sales Amount'].sum().reset_index()
salesTotal.sort_index(inplace=True)
salesTotal = salesTotal.sort_values(by=['Sales Amount'], ascending=False)

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

假设只有两种产品:

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()

假设只有两种产品:

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()

是的。橙色是一种产品,蓝色是另一种产品。我该如何绘制总销售额排名前十的公司?我可以在.sum()之后加上这个。sort_值(升序=假)[:10],所以它看起来不像我想要的那样工作。我得到的图表并不包括每家公司在堆叠吧台上出售的所有商品。而且,它不是按销售额的总和排序的。是的。橙色是一种产品,蓝色是另一种产品。我该如何绘制总销售额排名前十的公司?我可以在.sum()之后加上这个。sort_值(升序=假)[:10],所以它看起来不像我想要的那样工作。我得到的图表并不包括每家公司在堆叠吧台上出售的所有商品。而且,它不是按销售额的总和排序的。