Pandas DataFrame按分组回溯2-3天匹配字符串生成标记列方法
实现思路
- 预处理:将日期字段
ColB转换为pandas datetime类型,再按ColA、ColB升序排序,保证每个分组内的日期有序。 - 匹配标记:新增临时列标记每行
ColC是否匹配目标字符串,匹配为1,不匹配为0。 - 分组滚动计算:按
ColA分组后,对每个分组使用时间窗口滚动计算:- 用2天的滚动窗口计算窗口内标记的最大值(只要有1就说明区间内存在匹配)
- 将滚动结果偏移2天,刚好对应当前行往前2~3天的区间范围
- 结果清洗:日期不足无法回溯的行保留空值,其余结果转为整数。
可运行代码
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
相关产品推荐
相关产品推荐

