Pandas如何计算DataFrame每行对应未来7天指定列的数值总和
问题原因
你原先的写法是整列向量化比较,df.date > df.date 会对两个完全相同的列逐元素判断,结果全为False,筛选不到任何数据,求和结果为0,赋值给整列后自然全是0。
最优解决方案:使用pandas时间滚动窗口
该方案性能最优,适合大数据量场景,代码如下:
import pandas as pd from datetime import timedelta # 首先确保date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 将date设为索引并按时间排序,滚动窗口要求时间有序 df = df.set_index('date').sort_index() # 计算7天滚动窗口的value总和,减去当前行的value(需求为统计未来7天、不含当前行) df['next_7days'] = df.rolling('7D', closed='right').sum()['value'] - df['value'] # 重置索引恢复原始结构 df = df.reset_index()
运行后得到的next_7days和你的预期结果完全一致。
备用方案:逐行apply(逻辑易读,适合小数据量)
如果数据量不大,想要更直观的逻辑可以用该方案:
import pandas as pd from datetime import timedelta df['date'] = pd.to_datetime(df['date']) df['temp_end'] = df['date'] + timedelta(days=7) # 逐行筛选符合日期范围的value求和 df['next_7days'] = df.apply( lambda row: df[(df['date'] > row['date']) & (df['date'] <= row['temp_end'])]['value'].sum(), axis=1 ) # 删除临时列 df = df.drop('temp_end', axis=1)
内容的提问来源于stack exchange,提问作者Aezak
相关产品推荐
相关产品推荐

