如何在Pandas中按年周合并DataFrame,支持周数±n周匹配?
按ID和±1周范围合并两个DataFrame
原始数据
首先定义两个待合并的DataFrame:
import pandas as pd aa = pd.DataFrame({'id': ['a','a','a','b'], 'week': ['2022-W13','2022-W14', '2022-W19', '2022-W14']}) bb = pd.DataFrame({'id': ['a','a','a','a','a','a','b','b','b','b'], 'week': ['2022-W12','2022-W13','2022-W14','2022-W15','2022-W16','2022-W20', '2022-W13','2022-W14','2022-W15','2022-W16'], 'val': [0,1,2,3,4,5,6,7,8,9]})
aa结构:
| id | week |
|---|---|
| a | 2022-W13 |
| a | 2022-W14 |
| a | 2022-W19 |
| b | 2022-W14 |
bb结构:
| id | week | val |
|---|---|---|
| a | 2022-W12 | 0 |
| a | 2022-W13 | 1 |
| a | 2022-W14 | 2 |
| a | 2022-W15 | 3 |
| a | 2022-W16 | 4 |
| a | 2022-W20 | 5 |
| b | 2022-W13 | 6 |
| b | 2022-W14 | 7 |
| b | 2022-W15 | 8 |
| b | 2022-W16 | 9 |
需求说明
按id精确匹配,同时week允许±1周的范围进行合并:
aa中id='a'且week='2022-W13'的行,需匹配bb中id='a'且week为2022-W12、2022-W13、2022-W14的行aa中id='a'且week='2022-W14'的行,需匹配bb中id='a'且week为2022-W13、2022-W14、2022-W15的行- 以此类推,最终保留
bb中符合条件的所有不重复行
实现方案
通过将周字符串转换为可计算的数值,筛选周数差在±1范围内的匹配行,最后去重得到结果:
# 将week字符串转换为数值格式(年份*100 + 周数),方便计算周数差 def convert_week(week_str): year, week = week_str.split('-W') return int(year)*100 + int(week) aa['week_num'] = aa['week'].apply(convert_week) bb['week_num'] = bb['week'].apply(convert_week) # 按id全连接两个DataFrame,筛选周数差≤1的行 merged = pd.merge(aa, bb, on='id', suffixes=('_aa', '_bb')) filtered = merged[abs(merged['week_num_aa'] - merged['week_num_bb']) <= 1] # 提取目标列、去重并排序 result = filtered[['id', 'week_bb', 'val']].rename(columns={'week_bb': 'week'}) result = result.drop_duplicates().sort_values(['id', 'week']).reset_index(drop=True) print(result)
最终结果
运行上述代码后得到的DataFrame:
| id | week | val |
|---|---|---|
| a | 2022-W12 | 0 |
| a | 2022-W13 | 1 |
| a | 2022-W14 | 2 |
| a | 2022-W15 | 3 |
| a | 2022-W20 | 5 |
| b | 2022-W13 | 6 |
| b | 2022-W14 | 7 |
| b | 2022-W15 | 8 |
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

