You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas实现:按销售额从高到低标记贡献80%总销售额的产品

Pandas 实现累计销售额80%分档标记的方法

实现逻辑

  • 先计算全量产品的总销售额,得出80%总销售额的阈值
  • 将产品按销售额降序排序,保留原索引方便后续映射回原始表
  • 计算排序后的销售额累计值
  • 累计值未超过阈值、以及首次超过阈值的当前行(匹配刚好达标场景)标记为1,其余为0
  • 把标记映射回原始数据表即可

完整代码示例

import pandas as pd

# 此处替换为实际业务数据表,示例数据匹配你描述的场景(总销售额32)
df = pd.DataFrame({
    'product_id': [1,2,3,4,5,6,7,8],
    'sales': [2,10,3,8,5,1,3,0]
})

# 1. 计算80%总销售额阈值
total_sales = df['sales'].sum()
threshold = total_sales * 0.8

# 2. 按销售额降序排序
sorted_df = df.sort_values(by='sales', ascending=False, ignore_index=False)

# 3. 计算累计销售额
sorted_df['cum_sales'] = sorted_df['sales'].cumsum()

# 4. 打标:包含刚好跨过阈值的行,匹配你说的累计26达标的要求
sorted_df['label'] = (sorted_df['cum_sales'].shift(fill_value=0) <= threshold).astype(int)

# 5. 标记合并回原表
df = df.merge(sorted_df['label'], left_index=True, right_index=True)

print(df)

结果验证

你举的示例场景运行代码后,销售额最高的行2(10)、行4(8)、行5(5)、行7(3)累计总和为26,刚好超过25.6的阈值,这几行label都会被标记为1,其余行标记为0,和预期结果完全一致。

调整说明

如果不需要包含刚好跨过阈值的行,严格要求累计值≤80%阈值才打1,可以修改打标逻辑为:

sorted_df['label'] = (sorted_df['cum_sales'] <= threshold).astype(int)

内容的提问来源于stack exchange,提问作者A. Froughian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:36:08