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

如何在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结构:

idweek
a2022-W13
a2022-W14
a2022-W19
b2022-W14

bb结构:

idweekval
a2022-W120
a2022-W131
a2022-W142
a2022-W153
a2022-W164
a2022-W205
b2022-W136
b2022-W147
b2022-W158
b2022-W169

需求说明

按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:

idweekval
a2022-W120
a2022-W131
a2022-W142
a2022-W153
a2022-W205
b2022-W136
b2022-W147
b2022-W158

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:17:10