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

Pandas DataFrame按分组回溯2-3天匹配字符串生成标记列方法

实现思路

  1. 预处理:将日期字段ColB转换为pandas datetime类型,再按ColA、ColB升序排序,保证每个分组内的日期有序。
  2. 匹配标记:新增临时列标记每行ColC是否匹配目标字符串,匹配为1,不匹配为0。
  3. 分组滚动计算:按ColA分组后,对每个分组使用时间窗口滚动计算:
    • 用2天的滚动窗口计算窗口内标记的最大值(只要有1就说明区间内存在匹配)
    • 将滚动结果偏移2天,刚好对应当前行往前2~3天的区间范围
  4. 结果清洗:日期不足无法回溯的行保留空值,其余结果转为整数。

可运行代码

import pandas as pd
import numpy as np

# 构造示例数据(实际使用时替换为你自己的DataFrame即可)
data = {
    'ColA': ['B','B','B','B','B','H','H','H','H','H','X','X','X','X','X'],
    'ColB': ['2021-10-24','2021-10-25','2021-10-26','2021-10-27','2021-10-28']*3,
    'ColC': ['dog','cat','bird','dog','bird','cat','dog','dog','bird','cat','bird','dog','dog','dog','bird']
}
df = pd.DataFrame(data)

# 核心逻辑
# 1. 日期格式转换+排序
df['ColB'] = pd.to_datetime(df['ColB'])
df = df.sort_values(['ColA', 'ColB']).reset_index(drop=True)

# 2. 生成匹配标记列,如需修改匹配字符串,替换这里的'dog'即可
df['is_match'] = df['ColC'].eq('dog').astype(int)

# 3. 分组滚动计算
def calc_new_col(group):
    group = group.set_index('ColB')
    # 滚动窗口大小、偏移天数可根据需求调整,当前配置对应往前2-3天区间
    group['NewCol'] = group['is_match'].rolling('2D', closed='both').max().shift(freq='2D')
    group = group.reset_index()
    # 保留可空整数类型,空值为NA
    group['NewCol'] = group['NewCol'].astype('Int64')
    return group

df = df.groupby('ColA', group_keys=False).apply(calc_new_col)

# 4. 删除临时列,得到最终结果
df = df.drop(columns=['is_match'])
print(df)

说明

该方案使用时间窗口而非固定行数滚动,即使分组内日期不连续也能正常计算,性能优于逐行遍历的实现,适合大数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:03