如何基于多列多条件求和计算各物料过去30天累计发货量
实现方案(10万行数据秒级出结果,避免逐行遍历的性能问题)
你需要的是按物料分组的滑动时间窗口求和,直接用pandas内置的滚动时间窗口功能即可,比逐行apply性能高上百倍,步骤如下:
- 先把日期列转为pandas datetime格式,确保时间计算正常
import pandas as pd # 按你表中的日期格式修改format参数即可 df['cikistarihi'] = pd.to_datetime(df['cikistarihi'], format='%d.%m.%Y')
- 按物料分组,计算每个物料过去30天(不含当前发货日期)的累计发货量
# 先按物料+发货日期排序,保证时间顺序正确 df = df.sort_values(['malzeme', 'cikistarihi']).reset_index(drop=True) # 分组滚动计算30天求和 df['shipped qtys in last 30 days'] = df.groupby('malzeme', group_keys=False)\ .apply(lambda group: group.set_index('cikistarihi')['qty'] # 30天窗口,closed='left'表示排除当前行的发货日期,和你的筛选逻辑完全一致 .rolling('30D', closed='left') .sum() .fillna(0) .values )
方案说明
- 核心逻辑和你写的单行筛选代码完全一致:按物料隔离,统计早于当前发货日期、且距离当前日期不超过30天的发货量总和
- 内置滚动窗口是向量化计算,10万行数据实测耗时在1秒以内,完全不需要逐行遍历
- 如果一定要用你原来的逐行筛选逻辑做批量计算(非常不推荐,10万行可能要跑几分钟),可以用apply实现:
df['shipped qtys in last 30 days'] = df.apply( lambda row: df[ (df['malzeme']==row['malzeme']) & (df['cikistarihi'] < row['cikistarihi']) & (df['cikistarihi'] >= (row['cikistarihi']-pd.Timedelta(days=30))) ]['qty'].sum(), axis=1 )
内容的提问来源于stack exchange,提问作者CanerU
相关产品推荐
相关产品推荐

