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
相关产品推荐
相关产品推荐

