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

如何实现按ID左连接并累加指定日期前销量的DataFrame合并

双DataFrame关联计算历史累计销量实现方案

前置准备

首先确保你已经导入pandas库,且两份原始表命名如下:

  • 左表(含描述字段):df_desc,字段为ID、Date、Description
  • 右表(含销量字段):df_sales,字段为ID、Date、Num Sold

实现步骤

1. 数据预处理

首先统一两个表的日期格式,同时完成排序(merge_asof方法要求关联字段有序):

# 转换日期格式为datetime类型,避免字符串比对错误
df_desc['Date'] = pd.to_datetime(df_desc['Date'])
df_sales['Date'] = pd.to_datetime(df_sales['Date'])

# 两个表都按ID、日期升序排序
df_desc = df_desc.sort_values(by=['ID', 'Date']).reset_index(drop=True)
df_sales = df_sales.sort_values(by=['ID', 'Date']).reset_index(drop=True)

2. 聚合右表销量并计算累计值

先对右表按ID+日期聚合(避免同一ID同一天有多条销量记录的误差),再按ID分组计算历史累计销量:

# 同ID同日期的销量先求和
df_sales_agg = df_sales.groupby(['ID', 'Date'], as_index=False)['Num Sold'].sum()
# 按ID分组计算累计销量
df_sales_agg['累计销量'] = df_sales_agg.groupby('ID')['Num Sold'].cumsum()

3. 按规则匹配两张表

用pandas的merge_asof方法实现「同ID、右表日期<=左表日期」的匹配,该方法效率远高于普通左连接后过滤求和:

result = pd.merge_asof(
    left=df_desc,
    right=df_sales_agg[['ID', 'Date', '累计销量']],
    by='ID', # 按ID分组匹配
    on='Date', # 按日期关联
    direction='backward' # 匹配小于等于左表当前日期的最近右表记录
)
# 无匹配记录时累计销量填充为0
result['累计销量'] = result['累计销量'].fillna(0).astype(int)

结果验证

按你给出的示例场景:

右表ID为1的销量记录为2021/1/1销量4、2021/3/1销量50
左表ID为1的2021/2/1记录匹配到的累计销量为4,2021/5/1记录匹配到的累计销量为54,和需求完全一致。

最终输出的result表就包含你需要的ID、Date、Description、累计销量四个字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:39:02