按星期几与小时分组计算Pandas文本数量均值的问题
问题
我已经用以下代码按星期几(day_of_week)和小时(hour)分组统计了各时段的文本数量:
time_df = df.groupby( [ df["timestamp"].dt.dayofweek.rename("day_of_week"), df["timestamp"].dt.hour.rename("hour") ] ).size().reset_index(name="count")
得到的time_df包含day_of_week、hour、count三列。现在需要计算各时段的文本数量均值:比如day_of_week为0(周一)时,用该时段的count除以当月周一的天数。但直接把size()改成mean()时报错:
TypeError: agg function failed [how->mean,dtype->object]
我尝试在原始DataFrame中添加day_of_week列,通过统计同值分组的数量来计算均值,但不知道具体怎么实现。
补充说明
原始DataFrame包含timestamp和text列,已添加day_of_week列。希望最终得到包含day_of_week、hour、count、num_of_day_of_week、mean列的DataFrame,例如周一0点的count为21195,当月有4个周一,则均值为21195/4=5298.75。
解决方案
核心思路是先统计当月每种星期几的实际天数,再和时段统计结果关联计算均值,具体步骤如下:
步骤1:统计当月各星期几的天数
从原始数据中提取月份维度,分组统计每个月内每种星期几的天数:
# 提取YYYY-MM格式的月份,用于按月份统计星期几天数 df['month'] = df['timestamp'].dt.to_period('M') # 统计每个月中,每种星期几的真实天数(去重同一天的重复记录) day_counts = df.groupby(['month', 'day_of_week'])['timestamp'].dt.date.nunique().reset_index(name='num_of_day_of_week')
步骤2:带月份维度统计时段文本数量
调整分组维度,加入月份,确保后续能和星期几天数数据对应:
# 按月份、星期几、小时分组,统计各时段文本总数 time_with_month_df = df.groupby( ['month', 'day_of_week', 'hour'] ).size().reset_index(name='count')
步骤3:关联数据并计算均值
将两个结果表关联,通过除法得到各时段的日均文本数量:
# 按月份和星期几关联时段统计与天数统计数据 result_df = pd.merge(time_with_month_df, day_counts, on=['month', 'day_of_week'], how='left') # 计算均值 result_df['mean'] = result_df['count'] / result_df['num_of_day_of_week']
可选:合并多月份同时段数据
如果需要合并不同月份的同星期几-小时组合数据,计算整体均值:
final_df = result_df.groupby(['day_of_week', 'hour']).agg( total_count=('count', 'sum'), total_days=('num_of_day_of_week', 'sum'), mean=('mean', 'mean') ).reset_index()
注:直接替换size()为mean()报错的原因是,mean()需要对分组内的数值列计算平均值,而你的需求是基于星期几的天数做除法,并非对分组内的文本数量求平均,因此不能直接替换。
内容的提问来源于stack exchange,提问作者cicciodevoto
相关产品推荐
相关产品推荐

