Pandas用lambda计算日期间隔df2数值总和赋值给df1出错求助
原代码问题排查
- 区间条件不全:仅判断了小于当前行日期,没有加上大于等于当前行日期的下界限制,会统计到所有早于当前日期的所有数据,不符合区间统计要求
- 求和逻辑错误:直接对筛选后的df2调用
.sum()会返回所有列的求和结果(包含date列的求和值),是Series类型,无法直接赋值给df1的单列 - 类型不匹配:没有将两个df的date列统一转为datetime类型,字符串比较会出现逻辑错误
- 索引越界隐患:没有处理df1最后一行没有
date[i+1]的问题,会触发索引越界报错
可行实现方案
前置准备:统一日期格式
首先将两个DataFrame的date列转为pandas datetime类型,避免类型不匹配导致的逻辑错误:
import pandas as pd df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date'])
方案1:按自然日分组统计(效率最高,适用于df1日期间隔为1天的场景)
如果你的区间对应自然日,直接提取df2时间戳的日期分组求和,再合并到df1即可:
# 提取df2时间的日期维度,按日期分组求和Val df2_daily = df2.groupby(df2['date'].dt.date)['Val'].sum().reset_index() df2_daily['date'] = pd.to_datetime(df2_daily['date']) # 合并结果到df1,无匹配数据的日期Val填充为0 df1 = df1.merge(df2_daily, on='date', how='left', suffixes=('', '_sum')) df1['Val'] = df1['Val_sum'].fillna(0).astype(int) df1 = df1.drop(columns=['Val_sum'])
方案2:自定义区间统计(适用于df1日期间隔不固定的场景)
如果df1的日期间隔不是固定1天,需要严格匹配[df1.date[i], df1.date[i+1})区间,用以下方式实现:
# 新增区间结束时间列,最后一行的结束时间取df2最大时间+1天避免越界 df1['end_date'] = df1['date'].shift(-1).fillna(df2['date'].max() + pd.Timedelta(days=1)) # 按区间筛选求和 df1['Val'] = df1.apply( lambda row: df2[(df2['date'] >= row['date']) & (df2['date'] < row['end_date'])]['Val'].sum(), axis=1 ) # 删除临时列 df1 = df1.drop(columns=['end_date'])
内容的提问来源于stack exchange,提问作者user3532764
相关产品推荐
相关产品推荐

