如何实现按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
相关产品推荐
相关产品推荐

