为按日期分组后的Pandas DataFrame添加is_holiday列
问题描述
我有两个DataFrame:
Before:包含小时级时间戳、cnt(租赁量)、is_holiday(是否节假日的小时级标记)等字段的原始自行车租赁数据After:通过Pandas按日期分组求和cnt得到的日级数据
需要给After新增is_holiday列(当日为节假日则标记1,否则0),用来分析节假日和非节假日的租赁量差异,请问怎么修改分组代码实现这个需求?
解决方案
方法1:分组时同时聚合两个字段
同一天的is_holiday值应该是统一的(要么全天都是节假日,要么都不是),所以分组时可以对is_holiday取max()或者first(),同时求和cnt:
# 先把小时级时间戳转成日期格式(如果还没处理的话) Before['date'] = Before['timestamp'].dt.date # 分组聚合:sum统计当日总租赁量,max提取当日是否为节假日 After = Before.groupby('date').agg( cnt=('cnt', 'sum'), is_holiday=('is_holiday', 'max') # 也可以用'first'/'last',根据实际业务逻辑选 ).reset_index()
注:如果当日所有小时的is_holiday都是0,max()返回0;只要有一个小时标记为1(比如节假日当天全时段标记1),就返回1,完全符合需求。
方法2:给已生成的After补全字段
如果已经有现成的After数据,可以单独提取每日的节假日标记再合并:
# 先提取每日的is_holiday标记 daily_holiday = Before.groupby('date')['is_holiday'].max().reset_index() # 和已有的After数据合并 After = After.merge(daily_holiday, on='date', how='left')
方法3:先标记日级节假日再聚合
先给每一行数据添加上当日的节假日标记,再分组求和:
Before['date'] = Before['timestamp'].dt.date # 用transform给每行生成当日的is_holiday标记 Before['daily_holiday'] = Before.groupby('date')['is_holiday'].transform('max') # 分组求和租赁量,同时保留日级节假日标记 After = Before.groupby('date').agg( cnt=('cnt', 'sum'), is_holiday=('daily_holiday', 'first') ).reset_index()
内容的提问来源于stack exchange,提问作者krmbla
相关产品推荐
相关产品推荐

