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

如何按ID与时间戳匹配合并两个Pandas DataFrame?

Pandas DataFrame 按规则合并的实现方案

这种合并需求完全可行,以下是具体实现步骤:

步骤1:为df1匹配对应ID下timestamp之前df2的最后一条记录

  • 先对df2按ID和timestamp排序,保证时间顺序正确:
    df2_sorted = df2.sort_values(['ID', 'timestamp'])
    
  • 使用merge_asof实现精准匹配:该方法能为df1的每一行,找到同ID且timestamp不晚于当前行的df2最后一条记录,无匹配时用0填充:
    # 先对df1按timestamp排序,满足merge_asof的要求
    df1_merged = pd.merge_asof(
        df1.sort_values('timestamp'),
        df2_sorted[['ID', 'timestamp', 'value1sum', 'value2sum']],
        on='timestamp',
        by='ID',
        direction='backward'  # 找当前时间之前的最后一条记录
    ).fillna({'value1sum': 0, 'value2sum': 0})
    

步骤2:处理df2中符合条件的行

  • 先提取df1每个ID的最后一条记录的关键信息:timestamp、approved、sum值:
    df1_last_records = df1.groupby('ID').agg(
        max_timestamp=('timestamp', 'max'),
        approved=('approved', 'last'),
        sum=('sum', 'last')
    ).reset_index()
    
  • 筛选df2中同ID且timestamp晚于df1该ID最后时间的行,并补充df1的approved和sum值:
    # 合并df2和df1的最后记录信息,筛选符合条件的行
    df2_filtered = df2.merge(df1_last_records, on='ID', how='inner')
    df2_processed = df2_filtered[df2_filtered['timestamp'] > df2_filtered['max_timestamp']].copy()
    # 保留需要的字段,沿用df1的approved和sum
    df2_processed = df2_processed[['ID', 'timestamp', 'value1sum', 'value2sum', 'approved', 'sum']]
    

步骤3:合并最终结果

将处理后的df1和df2行合并,按ID和timestamp排序:

final_df = pd.concat([df1_merged, df2_processed], ignore_index=True).sort_values(['ID', 'timestamp'])

注意事项

如果df1或df2的timestamp字段不是datetime类型,需要先转换:

df1['timestamp'] = pd.to_datetime(df1['timestamp'])
df2['timestamp'] = pd.to_datetime(df2['timestamp'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:22