对整个DataFrame应用扩展窗口操作:Numba报错及替代方案
对整个DataFrame执行扩展窗口操作的问题与解决方案
问题场景
想要对整个DataFrame执行扩展窗口操作(而非默认的按列/按行),尝试使用method='table'参数配合Numba引擎时触发报错,报错信息翻译为:
numba.core.errors.TypingError: 在nopython模式流程中失败(步骤:nopython前端)
原代码示例:
import pandas as pd S = pd.Series([i / 100.0 for i in range(1, 11)]) d_from = pd.concat([S, S], axis=1) # 按列/按行的扩展窗口操作 d_from.expanding(axis=0).apply(sum, raw=True) d_from.expanding(axis=1).apply(sum, raw=True) # 尝试对整个DataFrame操作,触发报错 d_from.expanding(axis=1, method="table").apply(sum, raw=True, engine="numba")
一、Numba引擎报错的修复方案
报错原因:method='table'会把整个窗口的二维数组传入函数,但Python内置的sum函数无法被Numba的nopython模式正确推断类型。需要自定义适配Numba的二维数组处理函数:
import pandas as pd import numba S = pd.Series([i / 100.0 for i in range(1, 11)]) d_from = pd.concat([S, S], axis=1) # 用Numba装饰自定义函数,明确处理二维数组 @numba.njit def table_sum(arr): return arr.sum() # 执行整个DataFrame的扩展窗口操作 result = d_from.expanding(axis=1, method="table").apply(table_sum, engine="numba", raw=True) print(result)
说明:自定义函数通过numba.njit编译,让Numba能正确识别二维数组的类型,避免类型推断错误。
二、无需Numba的替代方案
方案1:手动遍历扩展窗口切片
适合任意自定义操作,直接对每个扩展窗口的DataFrame切片执行计算:
import pandas as pd S = pd.Series([i / 100.0 for i in range(1, 11)]) d_from = pd.concat([S, S], axis=1) results = [] # 遍历列方向的扩展窗口(从1列到所有列) for col_idx in range(1, d_from.shape[1]+1): window_data = d_from.iloc[:, :col_idx] # 这里替换为你需要的全局操作 window_result = window_data.sum().sum() # 保持每行结果一致,匹配原DataFrame行数 results.append([window_result] * len(d_from)) # 转换为结果DataFrame result_no_numba = pd.DataFrame(results).T result_no_numba.columns = d_from.columns print(result_no_numba)
方案2:利用累积运算特性(针对求和类操作)
如果是求和这类可累积的操作,可通过cumsum结合轴转换实现,效率更高:
import pandas as pd S = pd.Series([i / 100.0 for i in range(1, 11)]) d_from = pd.concat([S, S], axis=1) # 先按列方向累积求和,再对每行的累积结果全局求和 cumulative_col = d_from.cumsum(axis=1) result_cumsum = cumulative_col.sum(axis=1).values.reshape(-1,1).repeat(d_from.shape[1], axis=1) result_cumsum = pd.DataFrame(result_cumsum, columns=d_from.columns) print(result_cumsum)
说明:此方法利用Pandas内置的高效累积运算,避免循环,适合聚合类的扩展窗口操作。
内容的提问来源于stack exchange,提问作者P.Jo
相关产品推荐
相关产品推荐

