You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按工作日/周末分组计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:47:24