如何在pandas中按周对透视表日期分组,统计各分类唯一订单数
解决方案
首先确保你的date列已转换为pandas datetime类型,这是时间分组的前提:
df['date'] = pd.to_datetime(df['date'])
方法1:groupby阶段直接按周分组(无需新增列)
使用pd.Grouper可以直接在groupby参数中完成时间粒度转换,完全符合你不需要额外处理、直接在分组阶段完成周聚合的需求:
# 输出长表结构,每行对应 周/品类/子品类 维度的唯一订单数 week_unique_order = df.groupby([ pd.Grouper(key='date', freq='W'), # 按周分组,默认周日为周结束日 'category', 'subcategory' ])['order_id'].nunique().reset_index()
如果需要和你原有代码一致的宽表结构(周作为列维度),可以在后续加pivot转换:
# 转换为宽表,空缺值填充为0 week_unique_order_wide = week_unique_order.pivot( index=['category', 'subcategory'], columns='date', values='order_id' ).fillna(0)
自定义周起始日说明
如果需要调整周的起始时间,比如以周一作为一周的第一天,只需将freq='W'修改为freq='W-MON'即可。
关于resample报错的说明
你遇到的TypeError: resample() got an unexpected keyword argument 'how'报错是因为pandas 0.18版本之后就废弃了resample的how参数,旧教程中的resample('W', how='sum')这类写法已经失效,新版正确的resample写法需要在resample后链式调用聚合方法,但你这个多维度分组的场景用上述groupby+pd.Grouper的写法更简洁,不需要使用resample。
可选方法:先新增周列再分组
如果需要单独保存周字段供后续分析使用,可以先提取周周期列再分组:
# 新增周列,格式为 年-月-日/年-月-日 展示周的起止范围 df['week'] = df['date'].dt.to_period('W') week_unique_order = df.groupby(['week', 'category', 'subcategory'])['order_id'].nunique().reset_index()
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

