You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对整个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:20:20