Pandas:某值占组总和的百分比
Pandas: percentage of a value relative to the total of the group
我有一个包含产品列表销售数量的数据框。每个产品都分配了一个 design/range 名称。在每个设计中,可能有多个产品。如何仅在特定设计内执行计算以找到销售分成?我想找出给定范围内有多少百分比来自某种产品。到目前为止,我只能获取整个产品列表并计算每个产品占总销量的百分比。
原始数据帧:
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%
编辑:您应该看到 , because mine is basically doing the same thing in more steps ; I didn't know about .transform
它在单个 straight-forward 行中执行我在 2 中所做的事情。
至select仅满足特定条件的行(例如具有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
您需要一个简单的 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 %
我有一个包含产品列表销售数量的数据框。每个产品都分配了一个 design/range 名称。在每个设计中,可能有多个产品。如何仅在特定设计内执行计算以找到销售分成?我想找出给定范围内有多少百分比来自某种产品。到目前为止,我只能获取整个产品列表并计算每个产品占总销量的百分比。
原始数据帧:
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%
编辑:您应该看到 .transform
它在单个 straight-forward 行中执行我在 2 中所做的事情。
至select仅满足特定条件的行(例如具有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
您需要一个简单的 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 %