Use an asof
merge to bring the closest message in the past. allow_exact_matches=False
prevents merging on the same week.
df = df.sort_values('week') # Only b/c merge_asof requires sorted input
res = (pd.merge_asof(df, df.rename(columns={'Message': 'previous'}),
on='week', by='ID',
direction='backward', allow_exact_matches=False))
ID Message week previous
0 10 A 1 NaN
1 11 A 1 NaN
2 12 C 1 NaN
3 10 B 2 A
4 12 B 2 C
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…