Pandas分组计算日期维度下平均每购物篮收入时出现NaN值的问题排查
问题分析与解决
首先得指出你代码里的核心问题:当计算rev_per_basket时,你用了原始DataFrame test的revenue列(8行数据)去匹配分组后的basket_id.nunique()结果(3行数据)——这两个序列长度完全不匹配,Pandas没法正确对齐数据,自然就生成了NaN值。
正确的逻辑应该是:用每个日期的总营收(已经聚合到temp_test里的结果)除以该日期的唯一购物篮数量,这两个值都是按日期聚合后的结果,长度一致,能直接计算出平均每购物篮收入。
修正后的代码
import pandas as pd test = pd.DataFrame({'date': ['1/07/2019', '1/08/2019', '1/08/2019','1/07/2019', '1/08/2019', '1/09/2019', '1/07/2019', '1/07/2019'], 'basket_id': ['AB789', 'CD674', 'KL237', 'AB789', 'CD674', 'RS234', 'ST089', 'OP448'], 'product_id': ['1839', '0368', '5360', '2524', '1036', '1184', '9280', '7721'], 'revenue': [400, 500, 350, 200, 100, 450, 50, 150]}) # 按日期聚合,给列起更清晰的名字 temp_test = test.groupby(['date']).agg( total_revenue=('revenue', sum), unique_basket_count=('basket_id', 'nunique') ).reset_index() # 用聚合后的总营收除以购物篮数量得到平均值 temp_test['rev_per_basket'] = temp_test['total_revenue'] / temp_test['unique_basket_count'] print(temp_test)
运行结果
date total_revenue unique_basket_count rev_per_basket 0 1/07/2019 800 3 266.666667 1 1/08/2019 950 2 475.000000 2 1/09/2019 450 1 450.000000
(补充下:你提到的理想值226.66应该是笔误,1/07/2019的总营收是400+200+50+150=800,除以3个唯一购物篮,结果是800/3≈266.67)
内容的提问来源于stack exchange,提问作者kittlesjp
相关产品推荐
相关产品推荐

