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

如何基于每组最后日期合并并扩展两个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

解决方案

步骤说明

  1. 将所有日期列转换为datetime类型,确保日期比较的准确性
  2. 提取每个group的核心参数:固定的extend日期、扩展起始日期(该组在df2中的最后一条记录日期)
  3. 遍历每个group,合并原始df2数据和从df1中筛选出的补充数据
  4. 整理最终结果并按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:38:10