如何为按天分组的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)
逻辑解释
- 按日期分组:用
df_so.index.date作为分组键,确保每天的检测逻辑独立,不会跨天干扰。 - 标记连续"y":通过
(val == 'y') & (val.shift() == 'y')找到所有“当前行和上一行都是y”的位置,也就是连续两个y的第二个y所在行。 - 移位标记目标行:将上述标记向下移动一行(
shift(-1)),这样连续两个y之后的同天行就会被标记为True;分组最后一行因无下一行,用fillna(False)统一设为False。
内容的提问来源于stack exchange,提问作者nipy
相关产品推荐
相关产品推荐

