基于行条件与日期区间的Python DataFrame值求和实现
Python实现多条件日期区间的SUMIF式求和
步骤1:统一日期格式
首先需要将所有涉及日期的列转换为datetime类型,否则无法进行日期区间比较:
import pandas as pd # 转换df1的日期列 df1['date'] = pd.to_datetime(df1['date']) # 转换df2的日期列 df2['date'] = pd.to_datetime(df2['date']) # 转换df3的日期列 df3['open'] = pd.to_datetime(df3['open']) df3['invent'] = pd.to_datetime(df3['invent'])
步骤2:计算符合条件的sale总和
通过merge关联df1和df3(匹配loja和item),筛选出日期在open和invent区间内的记录,再分组求和:
# 关联df1与df3,匹配loja和item merged_sale = pd.merge(df1, df3, on=['loja', 'item'], how='inner') # 筛选日期在区间内的记录 filtered_sale = merged_sale[(merged_sale['date'] >= merged_sale['open']) & (merged_sale['date'] <= merged_sale['invent'])] # 按loja和item分组求和 sale_sum = filtered_sale.groupby(['loja', 'item'])['sale'].sum().reset_index(name='sale')
步骤3:计算符合条件的buy总和
用同样的逻辑处理df2:
# 关联df2与df3,匹配loja和item merged_buy = pd.merge(df2, df3, on=['loja', 'item'], how='inner') # 筛选日期在区间内的记录 filtered_buy = merged_buy[(merged_buy['date'] >= merged_buy['open']) & (merged_buy['date'] <= merged_buy['invent'])] # 按loja和item分组求和 buy_sum = filtered_buy.groupby(['loja', 'item'])['buy'].sum().reset_index(name='buy')
步骤4:合并结果并填充缺失值
将求和结果与df3合并,确保所有df3中的记录都被保留,缺失的求和值填充为0:
# 先合并sale_sum到df3 result = pd.merge(df3, sale_sum, on=['loja', 'item'], how='left') # 再合并buy_sum到结果 result = pd.merge(result, buy_sum, on=['loja', 'item'], how='left') # 填充缺失值为0 result[['sale', 'buy']] = result[['sale', 'buy']].fillna(0).astype(int) # 调整列顺序与期望结果一致 result = result[['loja', 'item', 'open', 'invent', 'buy', 'sale']]
最终结果
运行上述代码后,result将与你期望的输出一致:
loja item open invent buy sale 0 9288 97845 2022-12-01 2022-12-20 684 21 1 9925 33515 2022-12-02 2022-12-12 364 1302 2 9288 33515 2022-12-01 2022-12-20 0 0
内容的提问来源于stack exchange,提问作者Gabriel Almeida
相关产品推荐
相关产品推荐

