如何按小时与星期几分组Pandas DataFrame统计文本数量?
按星期几+小时分组统计文本总数的Pandas实现
问题描述
我有一个包含月度文本数据及时间戳的Pandas DataFrame,数据格式如下:
timestamp text 2023-01-01 00:00:00 ABC 2023-01-01 00:00:01 DEF 2023-01-01 00:00:01 GHI ...
需要统计每周每一天中每个小时的文本总数,最终得到24×7=168个统计值——比如将所有周日10点-11点的文本数累加,所有周一同一时段的文本数累加,以此类推覆盖一周7天的24个小时。
此前尝试按小时分组后仅按day_of_week统计,会丢失小时维度信息,只能得到7条结果,需要同时结合星期几和小时进行分组统计。
解决方案
方法一:直接从原DataFrame一步分组统计
利用Pandas的dt属性提取星期几(dayofweek,0=周一,6=周日)和小时(hour)两个维度,直接分组求和,无需中间步骤:
# 按星期几+小时分组,统计文本总数 result = df.groupby([ df["timestamp"].dt.dayofweek, df["timestamp"].dt.hour ])["text"].count().reset_index(name="total_count") # 重命名列名,提升可读性 result.rename(columns={"timestamp": "day_of_week"}, inplace=True)
执行后result会包含168行数据,每行对应day_of_week(0-6)与hour(0-23)的唯一组合,以及该组合下的累计文本总数。
方法二:基于已生成的hours_df二次分组
如果需要沿用你已经创建的hours_df,只需在groupby中同时传入day_of_week和小时字段,对小时级统计值求和:
# 从hours_df的timestamp中提取小时,与day_of_week共同分组 day_hour_df = hours_df.groupby([ "day_of_week", hours_df["timestamp"].dt.hour ])["count_hours"].sum().reset_index(name="total_count") # 重命名小时列 day_hour_df.rename(columns={"timestamp": "hour"}, inplace=True)
可选优化:将星期数字转换为中文名称
如果需要更直观的星期名称展示,可以添加映射转换:
weekday_mapping = {0: "周一", 1: "周二", 2: "周三", 3: "周四", 4: "周五", 5: "周六", 6: "周日"} result["day_name"] = result["day_of_week"].map(weekday_mapping)
内容的提问来源于stack exchange,提问作者cicciodevoto
相关产品推荐
相关产品推荐

