Pandas:某个值相对于组总数的百分比

问题描述 投票:0回答:2

我有一个包含产品列表销售数量的数据框。每个产品都分配有一个设计/系列名称。每个设计中可能有多个产品。如何仅在特定设计内执行计算以找到销售分配?我想找出给定范围内特定产品的百分比。到目前为止,我只能获取整个产品列表并计算每种产品对总销量的贡献百分比。

原始数据帧:

id  Product  Range  Quantity
1   Prod1      A    6        
2   Prod2      A    4         
3   Prod3      B    2         
4   Prod4      B    8           

计算后的数据框:

id  Product  Range  Quantity  % of range
1   Prod1      A    6             60%
2   Prod2      A    4             40%
3   Prod3      B    2             20%
4   Prod4      B    8             80%
python pandas dataframe pandas-groupby
2个回答
3
投票

您需要一个简单的

groupby.transform('sum')
来获取每组的总数,然后执行经典向量算术。

我提供了一个浮动示例和一个字符串示例:

total = df.groupby('Range')['Quantity'].transform('sum')

# as float
df['% of range'] = df['Quantity'].div(total)

# as string
df['% of range (str)'] = df['Quantity'].div(total).mul(100).astype(int).astype(str) + ' %'

输出:

   id Product Range  Quantity  % of range % of range (str)
0   1   Prod1     A         6         0.6             60 %
1   2   Prod2     A         4         0.4             40 %
2   3   Prod3     B         2         0.2             20 %
3   4   Prod4     B         8         0.8             80 %

3
投票

编辑:你应该看到mozway的解决方案,因为我的解决方案基本上是在更多步骤中做同样的事情;我不知道

.transform
它能以单一、直接的方式完成我在 2 中所做的事情。

仅选择满足特定条件的行(例如,

Product
的值等于
Prod1
):

df[df.Product == "Prod1]

因此,要获得 prod1 的数量总和(无论范围如何),您可以这样做:

df[df.Product == "Prod1"]["Quantity"].sum()

如果您想对每个值执行相同的操作,请使用 groupby :

sum_per_range = df[["Range", "Quantity"]].groupby("Range").sum()

为您提供每个范围的总量,现在我们需要创建一个将使用这些值的新列:

df["%"] = df.apply(lambda x: x.Quantity/sum_per_range[x.Range],
                   axis=1)
© www.soinside.com 2019 - 2024. All rights reserved.