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

如何在Pandas中按房间标记State为True区间内温度最大值

问题

现有包含room_id、temperature、State三列的Pandas DataFrame,需要新增Max列,标记每个room_id下State为True的连续区间内temperature的最大值位置。

样例数据

117     1.489000  True
        8.9       False
        2.5       False  
        4.370000  False  
        4.363333  True
        4.356667  True
118     4.35      True
        6.648000  True
        6.642667  True
        7.3       False
        9.4       False
        5.3       True
        7.1       True

期望输出

117     1.489000  True   max
        8.9       False
        2.5       False  
        4.370000  False  
        4.363333  True   max
        4.356667  True
118     4.35      True
        6.648000  True   max
        6.642667  True
        7.3       False
        9.4       False
        5.3       True
        7.1       True   max 

当前代码问题

原代码未考虑room_id维度,导致部分True区间的最大值未被正确标记:

Max = df_state.groupby(masque.cumsum()[~masque])['temperature'].agg(['idxmax'])
解决方案

核心逻辑是先按room_id分组,再在每个分组内识别State为True的连续区间,最后标记每个区间的温度最大值位置,具体实现代码如下:

  1. 初始化Max列为空字符串
df['Max'] = ''
  1. 定义分组处理函数,负责单个room_id内的最大值标记
def mark_max_in_group(group):
    # 生成State为True的连续区间编号:当State从False切换为True时,区间编号递增
    group['interval'] = (group['State'] & ~group['State'].shift(1).fillna(False)).cumsum()
    # 筛选出State为True的行,按区间分组找到每个区间的温度最大值索引
    true_rows = group[group['State']]
    if not true_rows.empty:
        max_indices = true_rows.groupby('interval')['temperature'].idxmax()
        # 标记最大值位置
        group.loc[max_indices, 'Max'] = 'max'
    # 删除临时生成的interval列
    return group.drop(columns='interval')
  1. 按room_id分组应用上述函数
df = df.groupby('room_id', group_keys=False).apply(mark_max_in_group)

该方案会确保每个room_id下的每一段连续True区间,都能准确标记出温度最大值的位置,解决原代码忽略room_id维度的问题。

内容的提问来源于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 05:15:47