如何高效计算Pandas DataFrame库存列?Python无循环处理大数据集
解决Pandas大数据集下高效计算库存列的问题
核心思路
你的库存计算规则可简化为递推公式:
当日库存 = max(前一日库存, 0) + (当日供应 - 当日需求)
首日初始库存为0,后续每日基于前一日结果计算,无需手动编写低效循环。
方法实现
首先构造示例数据集:
import pandas as pd import numpy as np from itertools import accumulate import numba df = pd.DataFrame({ 'day': [1,2,3,4,5,6,7], 'demand': [11,11,11,11,11,11,11], 'supply': [21,0,0,23,0,0,0] }) # 先计算每日供需净变化 df['net'] = df['supply'] - df['demand']
方法1:Numba JIT加速(超大数据集首选)
利用Numba将循环编译为机器码,彻底消除Python循环的性能开销,百万级行数据也能快速处理:
@numba.jit(nopython=True) def calculate_stock(net_arr): stock_arr = np.zeros_like(net_arr) prev_stock = 0 for i in range(len(net_arr)): prev_stock = max(prev_stock, 0) + net_arr[i] stock_arr[i] = prev_stock return stock_arr df['stock'] = calculate_stock(df['net'].values)
方法2:Itertools Accumulate(代码简洁,中小数据集首选)
用Python内置的itertools.accumulate实现自定义累积逻辑,底层为C实现,性能优于纯Python循环:
def stock_accumulator(prev_stock, current_net): return max(prev_stock, 0) + current_net # initial=0指定首日初始库存,[1:]去掉初始值只保留每日结果 df['stock'] = list(accumulate(df['net'], stock_accumulator, initial=0))[1:]
方法3:Pandas Expanding Apply(逻辑直观)
利用Pandas的扩展窗口函数实现,适合快速验证逻辑,中小数据集可用:
def compute_daily_stock(net_series): if len(net_series) == 1: # 首日:初始库存0 + 当日净变化 return max(0, 0) + net_series.iloc[0] # 非首日:前一日库存取max(前值,0) + 当日净变化 return max(net_series.iloc[-2], 0) + net_series.iloc[-1] df['stock'] = df['net'].expanding().apply(compute_daily_stock)
结果验证
运行任意方法后,df['stock']的结果将与示例完全一致:
0 10 1 -1 2 -11 3 12 4 1 5 -10 6 -11 Name: stock, dtype: int64
内容的提问来源于stack exchange,提问作者Shlim
相关产品推荐
相关产品推荐

