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

如何为按天分组的DataFrame添加连续'y'触发的True标记列?

如何为DataFrame添加符合单日连续"y"检测逻辑的新列desired_col

需求说明

需为给定的DataFrame添加新列desired_col,规则如下:

  • 仅在同一天内检测:若出现连续两个"y",且这两个"y"之后还有同天的行,则将该行标记为True
  • 每天的检测逻辑独立重置,不跨天延续

原始数据

import pandas as pd

df_so = pd.DataFrame(
    {"val": ["y", "y", "y", "n", "y", "y", "y", "y", "n", "n", "y", "y", "n"]},
    index=pd.date_range(start="1/1/2018", periods=13, freq="8h"),
)

数据预览:

val
2018-01-01 00:00:00  y
2018-01-01 08:00:00  y
2018-01-01 16:00:00  y
2018-01-02 00:00:00  n
2018-01-02 08:00:00  y
2018-01-02 16:00:00  y
2018-01-03 00:00:00  y
2018-01-03 08:00:00  y
2018-01-03 16:00:00  n
2018-01-04 00:00:00  n
2018-01-04 08:00:00  y
2018-01-04 16:00:00  y
2018-01-05 00:00:00  n

期望输出

val  desired_col
2018-01-01 00:00:00  y        False
2018-01-01 08:00:00  y        False
2018-01-01 16:00:00  y         True
2018-01-02 00:00:00  n        False
2018-01-02 08:00:00  y        False
2018-01-02 16:00:00  y        False
2018-01-03 00:00:00  y        False
2018-01-03 08:00:00  y        False
2018-01-03 16:00:00  n         True
2018-01-04 00:00:00  n        False
2018-01-04 08:00:00  y        False
2018-01-04 16:00:00  y        False
2018-01-05 00:00:00  n        False

解决方案

通过按日期分组+移位标记实现需求,代码如下:

def process_daily_group(group):
    # 标记分组内连续两个"y"的第二个"y"的位置
    consecutive_y = (group['val'] == 'y') & (group['val'].shift() == 'y')
    # 将连续两个"y"的下一行标记为True,无下一行则填充为False
    group['desired_col'] = consecutive_y.shift(-1).fillna(False)
    return group

# 按日期分组处理后合并结果
df_result = df_so.groupby(df_so.index.date).apply(process_daily_group)

逻辑解释

  1. 按日期分组:用df_so.index.date作为分组键,确保每天的检测逻辑独立,不会跨天干扰。
  2. 标记连续"y":通过(val == 'y') & (val.shift() == 'y')找到所有“当前行和上一行都是y”的位置,也就是连续两个y的第二个y所在行。
  3. 移位标记目标行:将上述标记向下移动一行(shift(-1)),这样连续两个y之后的同天行就会被标记为True;分组最后一行因无下一行,用fillna(False)统一设为False。

内容的提问来源于stack exchange,提问作者nipy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:15:32