如何参照Pandas销售目标DataFrame对销售DataFrame按限定条数求和
实现方案
核心思路
- 先对销售表按客户分组,给每个客户的销售记录按现有顺序生成递增行号(从1开始计数)
- 将销售目标表和加了行号的销售表按客户ID关联
- 过滤出行号小于等于对应客户销售目标的记录
- 按客户分组聚合,分别计算总实际销售笔数、符合要求的销售额总和,匹配对应销售目标即可
代码实现(兼容pandas 0.24.0)
import pandas as pd # 构造示例销售表 sales_df = pd.DataFrame({ 'Cust_ID': ['A11','A11','A11','A11','B22','B22','B22','C33','C33'], 'Date': ['02.01.2021','03.01.2021','04.01.2021','05.01.2021','05.01.2021','06.01.2021','07.01.2021','08.01.2021','09.01.2021'], 'Value': [100,100,100,100,100,100,100,100,100] }) # 构造示例销售目标表 target_df = pd.DataFrame({ 'Cust_ID': ['A11','B22','C33'], 'Sales_Target': [4,2,4] }) # 1. 给每个客户的销售记录加行号(按现有顺序,从1开始计数) sales_df['row_num'] = sales_df.groupby('Cust_ID').cumcount() + 1 # 2. 关联销售目标 sales_with_target = sales_df.merge(target_df, on='Cust_ID', how='left') # 3. 过滤出符合目标数量的前N条记录 valid_sales = sales_with_target[sales_with_target['row_num'] <= sales_with_target['Sales_Target']] # 4. 聚合计算结果 # 先算每个客户总实际销售笔数 total_sales_count = sales_df.groupby('Cust_ID').size().reset_index(name='Sales') # 算符合要求的销售额总和 valid_sales_sum = valid_sales.groupby(['Cust_ID','Sales_Target'])['Value'].sum().reset_index(name='Sales_Value') # 合并得到最终结果 result = valid_sales_sum.merge(total_sales_count, on='Cust_ID', how='left') # 调整列顺序为要求的格式 result = result[['Cust_ID','Sales_Target','Sales','Sales_Value']] print(result)
输出结果
Cust_ID Sales_Target Sales Sales_Value 0 A11 4 4 400 1 B22 2 3 200 2 C33 4 2 200
注意事项
- 代码中销售记录的顺序默认使用原始销售表的顺序,如果你需要按日期排序后再取前N条,可以在加行号前先对
sales_df按Cust_ID和Date排序即可。 - 所有用到的方法均兼容pandas 0.24.0版本,无需高版本API支持。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

