按房间分组:加热起始点晚于结束点时移位DataFrame列值
问题解决方法
原代码的问题
- 错误的条件判断:
groupby('room_id')['hour'].first()返回的是一个Series(每个房间对应一个布尔值),你把它和True直接比较,这个条件永远不会成立,导致后续的shift操作根本没执行。 - 未赋值结果:就算条件正确,
groupby.shift(1)是返回新的DataFrame,你没把结果赋值给原变量,等于白操作。
正确实现步骤
1. 筛选需要调整的房间ID
先找出所有「第一个加热起始时间晚于第一个加热结束时间」的房间ID:
# 对比每个房间的首个起始/结束时间,得到布尔Series room_compare = p_heat_start.groupby('room_id')['hour'].first() > p_heat_stop.groupby('room_id')['hour'].first() # 提取需要调整的房间ID列表 rooms_to_shift = room_compare[room_compare].index.tolist()
2. 对目标分组执行shift操作
定义分组处理函数,只给符合条件的房间做shift:
def process_group(group): # group.name就是当前分组的room_id if group.name in rooms_to_shift: return group.shift(1) else: return group # 将处理后的结果赋值回原DataFrame的hour列 p_heat_start['hour'] = p_heat_start.groupby('room_id')['hour'].apply(process_group)
简洁版写法(用transform)
如果不想单独提取房间列表,也可以直接在transform里做判断:
p_heat_start['hour'] = p_heat_start.groupby('room_id')['hour'].transform( lambda x: x.shift(1) if x.iloc[0] > p_heat_stop[p_heat_stop['room_id'] == x.name]['hour'].iloc[0] else x )
效果验证
处理后,符合条件的房间分组开头会新增NaN,后续数据下移,和你给出的示例结果一致。
内容的提问来源于stack exchange,提问作者Toinou
相关产品推荐
相关产品推荐

