Python:如何将数据转换为按用户分组的周度统计数据框?
实现DataFrame按周分组宽表转换的最优方法
完整代码实现
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'User': ['x', 'x', 'y', 'z'], 'Date': ['2021/03/01', '2021/03/09', '2021/03/09', '2021/03/17'], 'Items': [3, 5, 11, 7] }) # 转换日期格式并计算当月周数 df['Date'] = pd.to_datetime(df['Date']) df['Week'] = 'Week ' + ((df['Date'].dt.day - 1) // 7 + 1).astype(str) # 生成透视表,填充缺失值为0 pivot_result = df.pivot_table( index='User', columns='Week', values='Items', aggfunc='sum', fill_value=0 ).reset_index() # 添加Total列 pivot_result['Total'] = pivot_result.iloc[:, 1:].sum(axis=1) # 调整列顺序匹配需求 final_df = pivot_result[['User', 'Week 1', 'Week 2', 'Week 3', 'Total']] print(final_df)
关键步骤说明
- 日期与周数处理:将
Date转为datetime类型后,通过(day-1)//7 +1计算当月内的周序号(确保3月1日属于Week1,3月9日属于Week2,3月17日属于Week3),再拼接成Week N的格式。 - 透视表转换:使用
pivot_table快速实现长表转宽表,自动按User分组、Week分列,对Items求和并将缺失的周数填充为0,比groupby+unstack更简洁高效。 - 总计列计算:通过
iloc[:,1:]选中所有周数据列,逐行求和得到Total。 - 列顺序调整:手动指定列顺序,确保输出与需求完全一致。
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

