如何用Pandas从首笔非零订单月份起计算客户12个月销售均值?
解决方案:计算客户首次下单后的销售均值
问题核心是要排除首次下单前的所有月份(无论是否为0),只计算首次下单月份及之后的所有月份销售额均值(包含该期间的零销售额)。直接用.mean()会把整个12个月的数据都算进去,包括首次下单前的无效零值,所以结果不对。
下面分两种常见的数据格式给出实现方案:
一、宽表格式(每行一个客户,每列对应一个月份销售额)
假设你的数据结构是每个客户一行,列是customer_id+12个月份的销售额,示例代码如下:
import pandas as pd # 构造示例数据(模拟12个月的情况,这里简化为5个月) data = pd.DataFrame({ 'customer_id': [1, 2, 3], 'month1': [0, 20, 0], 'month2': [50, 0, 0], 'month3': [0, 40, 10], 'month4': [20, 0, 0], 'month5': [0, 15, 0] # 可扩展到month12,逻辑完全一致 }) # 定义计算单个客户目标均值的函数 def get_mean_from_first_order(row): # 提取当前客户的所有销售额列(排除customer_id) sales_data = row.drop('customer_id') # 找到第一个非零销售额对应的月份列(首次下单月份) first_order_col = sales_data.ne(0).idxmax() # 截取首次下单及之后的所有销售额数据 relevant_sales = sales_data.loc[first_order_col:] # 返回该区间的均值 return relevant_sales.mean() # 对每个客户应用函数,得到结果 data['mean_after_first_order'] = data.apply(get_mean_from_first_order, axis=1) # 查看结果 print(data[['customer_id', 'mean_after_first_order']])
二、长表格式(每行是客户-月份的销售额记录)
如果数据是长表结构(每个客户每个月一条记录),示例代码如下:
import pandas as pd # 构造长表示例数据 long_data = pd.DataFrame({ 'customer_id': [1,1,1,2,2,2,3,3,3], 'month': [1,2,3,1,2,3,1,2,3], 'sales': [0,50,0,20,0,40,0,0,10] }) # 第一步:计算每个客户的首次下单月份(筛选销售额>0的记录,取最小月份) first_order_info = long_data[long_data['sales'] > 0].groupby('customer_id')['month'].min().reset_index() first_order_info.rename(columns={'month': 'first_order_month'}, inplace=True) # 第二步:将首次下单月份合并回原数据 merged_data = pd.merge(long_data, first_order_info, on='customer_id') # 第三步:筛选出首次下单及之后的所有月份数据 valid_data = merged_data[merged_data['month'] >= merged_data['first_order_month']] # 第四步:按客户分组计算均值 customer_mean_result = valid_data.groupby('customer_id')['sales'].mean().reset_index() customer_mean_result.rename(columns={'sales': 'mean_after_first_order'}, inplace=True) # 查看结果 print(customer_mean_result)
关键逻辑说明
- 先定位每个客户的首次下单月份:通过筛选销售额非零的记录,取最早的月份;
- 只保留该月份及之后的所有数据(包括该期间的零销售额);
- 对筛选后的子集计算均值,这样就排除了首次下单前的无效数据。
内容的提问来源于stack exchange,提问作者aleks.zheltkov
相关产品推荐
相关产品推荐

