Pandas使用NamedAgg按小时、来源分组实现带条件分状态订单数统计
需求可行性判定
该需求完全可通过pandas.NamedAgg实现,无需将order_state列纳入分组维度,即可完成跨订单状态的条件统计。
问题根因定位
现有代码的条件计数逻辑存在本质偏差:
lambda x: (x == 'finished').count()
上述代码执行时,x == 'finished'会生成布尔值序列,调用序列的.count()方法仅会统计序列内非空元素的总数量,和布尔值本身的真假无关,因此最终计算结果和直接统计分组内总行数完全一致,直接导致所有统计列都输出全量订单数的异常现象。
修正实现
将原有计数逻辑调整为对布尔序列求和即可:pandas中布尔序列的.sum()方法会自动将True映射为1、False映射为0做累加计算,结果恰好等于序列内符合条件的元素个数。
修正后的完整代码如下:
orders_agg = orders.groupby( by=[pandas.Grouper(key='created_at', freq='H'), 'source'] ).agg( orders_count=pandas.NamedAgg('created_at', 'count'), finished_orders_count=pandas.NamedAgg('order_state', lambda x: (x == 'finished').sum()), cancelled_orders_count=pandas.NamedAgg('order_state', lambda x: (x == 'offer_cancelled').sum()) ).reset_index().rename(columns={'created_at': 'datetime_msk'})
补充说明:上述实现全程未修改分组维度,仅在聚合阶段对
order_state列做条件判断,输出结果会按小时时间粒度、source维度拆分,同步展示总订单量、已完成订单量、已取消订单量的统计值,完全匹配预期统计效果。
内容的提问来源于stack exchange,提问作者user14360444
相关产品推荐
相关产品推荐

