如何在Pandas中按日期匹配Variant,将df2的Qty加到df1当月末的Qty
pandas实现匹配Variant并累加qty到对应月份最后一条记录
需求描述
现有两个DataFrame:
- df1:包含日期、Variants、qty字段,同一Variant在对应月份有多条日期记录
- df2:包含Variants、qty字段,存储需要累加的qty值
需完成以下操作:
- 匹配df1和df2中的
Variants - 将df2中匹配Variant的qty值,加到df1对应Variant所在月份最后一个日期记录的qty字段上
- 非最后日期的记录qty保持不变
示例:
df1中Variant A的2022年1月最后日期为31日,对应qty为2;df2中Variant A的qty为5。处理后,df1中Variant A在31日的qty变为7,其余日期记录不变。
实现代码
import pandas as pd # 确保df1的日期列是datetime类型 df1['Date'] = pd.to_datetime(df1['Date']) # 为df1添加年月标识,用于分组定位每月最后一条记录 df1['year_month'] = df1['Date'].dt.to_period('M') # 找出每个Variant+年月组合的最后一条记录的索引 last_dates_idx = df1.groupby(['Variants', 'year_month'])['Date'].idxmax() # 合并df2的qty到df1,匹配不到的Variant填充0 df1 = df1.merge(df2, on='Variants', how='left', suffixes=('', '_add')) df1['qty_add'] = df1['qty_add'].fillna(0) # 仅对每月最后一条记录的qty进行累加 df1.loc[last_dates_idx, 'qty'] += df1.loc[last_dates_idx, 'qty_add'] # 清理临时辅助列 df1 = df1.drop(columns=['year_month', 'qty_add']) # 输出处理后的结果 print(df1)
代码说明
- 日期格式转换:将df1的日期列转为datetime类型,确保后续年月分组、最大日期查找的准确性
- 年月分组标识:生成
year_month列,用于按Variant+月份维度分组 - 定位最后记录索引:通过
groupby结合idxmax,精准定位每个Variant对应月份的最后一条日期记录位置 - 合并数据:将df2的qty值合并到df1中,对未匹配到的Variant填充0,避免空值运算报错
- qty累加操作:仅对每月最后一条记录的qty字段执行累加,不影响其他日期的记录
- 清理临时列:删除过程中生成的辅助列,得到结构整洁的最终结果
内容的提问来源于stack exchange,提问作者kanika
相关产品推荐
相关产品推荐

