如何基于每组最后日期合并并扩展两个Pandas DataFrame?
问题:按Group扩展DataFrame数据
原始数据
import pandas as pd df1 = pd.DataFrame( { 'close': [100, 150, 200, 55, 69, 221, 2210, 111, 120, 140, 150, 170], 'date': [ '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08', '2024-01-09', '2024-01-10', '2024-01-11', '2024-01-12', ] } ) df2 = pd.DataFrame( { 'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], 'close': [100, 105, 112, 117, 55, 65, 221, 211], 'date': [ '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08' ], 'extend': [ '2024-01-09', '2024-01-09', '2024-01-09', '2024-01-09', '2024-01-11', '2024-01-11', '2024-01-11', '2024-01-11' ], } )
需求说明
- 每个
group有固定的extend日期,以此为扩展终点 - 以该组在
df2中的最后一条date为扩展起点 - 从
df1中提取起点到终点区间内的date和close数据,补充到对应group中,保留group和extend字段
预期输出
group close date extend 0 a 100 2024-01-01 2024-01-09 1 a 105 2024-01-02 2024-01-09 2 a 112 2024-01-03 2024-01-09 3 a 117 2024-01-04 2024-01-09 4 a 69 2024-01-05 2024-01-09 5 a 221 2024-01-06 2024-01-09 6 a 2210 2024-01-07 2024-01-09 7 a 111 2024-01-08 2024-01-09 8 a 120 2024-01-09 2024-01-09 9 b 55 2024-01-05 2024-01-11 10 b 65 2024-01-06 2024-01-11 11 b 221 2024-01-07 2024-01-11 12 b 211 2024-01-08 2024-01-11 13 b 120 2024-01-09 2024-01-11 14 b 140 2024-01-10 2024-01-11 15 b 150 2024-01-11 2024-01-11
解决方案
步骤说明
- 将所有日期列转换为
datetime类型,确保日期比较的准确性 - 提取每个
group的核心参数:固定的extend日期、扩展起始日期(该组在df2中的最后一条记录日期) - 遍历每个
group,合并原始df2数据和从df1中筛选出的补充数据 - 整理最终结果并按
group和date排序
实现代码
# 转换日期列格式为datetime df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date']) df2['extend'] = pd.to_datetime(df2['extend']) # 提取每个group的扩展边界参数 group_params = df2.groupby('group').agg( extend_date=('extend', 'first'), start_date=('date', 'last') ).reset_index() # 存储每个group的合并结果 group_results = [] for _, params in group_params.iterrows(): group_name = params['group'] start_dt = params['start_date'] extend_dt = params['extend_date'] # 获取当前group的原始数据 original_data = df2[df2['group'] == group_name].copy() # 从df1筛选需要补充的日期区间:start_dt < date <= extend_dt supplement_data = df1[(df1['date'] > start_dt) & (df1['date'] <= extend_dt)].copy() # 补充group和extend字段 supplement_data['group'] = group_name supplement_data['extend'] = extend_dt # 合并原始数据与补充数据 combined_data = pd.concat([original_data, supplement_data], ignore_index=True) group_results.append(combined_data) # 合并所有group的结果并排序 final_result = pd.concat(group_results, ignore_index=True) final_result = final_result.sort_values(['group', 'date'], ignore_index=True) print(final_result)
代码解释
- 日期转换:统一日期格式,避免字符串比较的逻辑错误
- 参数提取:通过
groupby.agg高效获取每组的扩展边界,无需重复遍历数据 - 区间筛选:使用布尔索引精准定位需要补充的记录,确保只取起始日期之后、截止日期之前(含)的数据
- 数据合并:拼接原始数据与补充数据后排序,完全匹配预期输出格式
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

