如何按工作日/周末分组计算DataFrame小时级短信均值并生成新表?
Got it!用Pandas来实现这个需求非常直接,我给你一步步拆解代码和逻辑:
实现工作日/周末分组求SMS均值
核心思路
先给原始数据打标签区分工作日(x,对应Day_of_week 1-5)和周末(y,对应Day_of_week 0、6),再按UserID、标签、hour、min分组计算SMS的平均值,最后调整格式匹配你的需求。
完整代码实现
import pandas as pd import numpy as np # ---------------------- # 1. 加载你的原始DataFrame(如果已经加载好可以跳过这步) # 这里模拟你的示例数据 data = { 'UserID': [1]*6 + [1]*4, 'Day_of_week': [1,1,1,1,1,1,2,2,2,2], 'hour': [0,0,1,1,2,2,0,0,1,1], 'min': [0,30,0,30,0,30,0,30,0,30], 'sms': [12,20,19,11,12,7,142,201,129,111] } df = pd.DataFrame(data) # ---------------------- # 2. 添加分组标签列:x=工作日,y=周末 df['Day_group'] = np.where(df['Day_of_week'].isin(range(1,6)), 'x', 'y') # ---------------------- # 3. 分组计算均值,重置索引得到目标格式 result_df = df.groupby(['UserID', 'Day_group', 'hour', 'min'])['sms'].mean().reset_index() # ---------------------- # 4. 重命名列名匹配你的示例 result_df.rename(columns={'Day_group': 'Day_of_week'}, inplace=True) # 可选:保留1位小数,和示例格式一致 result_df['sms'] = result_df['sms'].round(1) # 查看结果 print(result_df)
代码解释
- 分组标签生成:用
np.where快速判断Day_of_week的取值范围,1-5标记为x,其余(0、6)标记为y,比循环判断高效得多。 - 分组计算:
groupby指定UserID、分组标签、hour、min这四个维度,对sms列求均值,reset_index()把分组后的索引转回普通列,符合你要的表格格式。 - 格式调整:重命名列名后,用
round(1)可以把均值保留1位小数,完全匹配示例里的12.1这种格式。
多用户场景适配
如果你的数据里有多个UserID,这段代码会自动按每个用户单独计算分组均值,不需要额外修改,非常灵活。
内容的提问来源于stack exchange,提问作者user147460
相关产品推荐
相关产品推荐

