如何在Python Pandas中对多数据点的单元格值重算百分比至总和100%?
解决Pandas中产品门店加权百分比归一化问题
嘿,我懂你查了半天没找到简洁实现的困扰😆——其实这个需求用Pandas的分组和transform功能就能轻松搞定,咱们一步步拆解来做:
核心思路
你需要的是三个关键步骤:
- 计算每个产品-门店组合的加权得分(可用性 × 门店重要性)
- 按产品分组,计算每组的加权得分总和
- 将每个门店的加权得分除以组总和,再乘以100得到占比(保证每组总和为100%)
示例代码实现
先构造一个和你场景匹配的示例数据集,方便你对照理解:
import pandas as pd # 模拟你的产品-门店数据 data = { '产品': ['A', 'A', 'A', 'A', 'B', 'B', 'B'], '门店': ['食品店', '药店', 'Target', 'Walmart', '食品店', '药店', 'Walmart'], '可用性': [1, 1, 0, 1, 1, 0, 1], # 1表示可用,0表示不可用 '门店重要性': [0.2, 0.3, 0.1, 0.4, 0.25, 0.35, 0.4] # 0-1之间的权重值 } df = pd.DataFrame(data)
第一步:计算加权得分
先给每一行计算可用性 × 门店重要性的结果:
df['加权得分'] = df['可用性'] * df['门店重要性']
第二步:按产品分组计算总和
用transform方法把每组的加权总分映射回原数据的每一行,这样后续可以直接计算占比:
df['产品加权总分'] = df.groupby('产品')['加权得分'].transform('sum')
第三步:归一化到100%
最后计算每个门店的占比,同时处理可能的除以0情况(比如某个产品所有门店都不可用):
# 计算百分比,并用fillna处理总分为0的情况 df['最终百分比'] = (df['加权得分'] / df['产品加权总分']) * 100 df['最终百分比'] = df['最终百分比'].fillna(0)
最终结果示例
运行完上面的代码后,你的数据框会变成这样(保留两位小数):
| 产品 | 门店 | 可用性 | 门店重要性 | 加权得分 | 产品加权总分 | 最终百分比 |
|---|---|---|---|---|---|---|
| A | 食品店 | 1 | 0.2 | 0.2 | 0.9 | 22.22 |
| A | 药店 | 1 | 0.3 | 0.3 | 0.9 | 33.33 |
| A | Target | 0 | 0.1 | 0.0 | 0.9 | 0.00 |
| A | Walmart | 1 | 0.4 | 0.4 | 0.9 | 44.44 |
| B | 食品店 | 1 | 0.25 | 0.25 | 0.65 | 38.46 |
| B | 药店 | 0 | 0.35 | 0.0 | 0.65 | 0.00 |
| B | Walmart | 1 | 0.4 | 0.4 | 0.65 | 61.54 |
可以看到每个产品的最终百分比列总和都是100%,完全符合你的需求~
内容的提问来源于stack exchange,提问作者LaurenH
相关产品推荐
相关产品推荐

