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

按房间分组:加热起始点晚于结束点时移位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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:55:28