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

如何快速对Pandas DataFrame每行执行多项式回归?

更快的逐行多项式回归实现方法(针对Pandas大DataFrame)

原始数据与需求

给定如下Pandas DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({0: [11, 12, 31], 1: [6, 14, 27], 2: [11, 24, 21], 3: [1, 24, 20]})

DataFrame内容:

0   1   2   3
0  11   6  11   1
1  12  14  24  24
2  31  27  21  20

需求为:对每行执行二次多项式回归,以列名作为X值,行内元素作为Y值。

已知使用iterrows的实现方式,但在处理大型DataFrame时耗时过长:

x = df.columns.to_numpy()

for index, row in df.iterrows():
    print(np.polyfit(x, row, 2))

输出结果:

[-1.25  1.25  9.75]
[-0.5  6.1 11.1]
[ 0.75 -6.15 31.35]

更高效的向量化实现

iterrows的低效源于Python层面的逐行循环,我们可以通过向量化线性代数运算一次性完成所有行的拟合,大幅提升速度。

实现步骤:

  1. 构造多项式回归的设计矩阵
    对于二次多项式(degree=2),设计矩阵包含X的0次、1次、2次幂:

    x = df.columns.to_numpy()
    # 构造形状为(样本数, 多项式次数+1)的设计矩阵
    X_design = np.vstack([x**i for i in range(3)]).T
    

    此时X_design的内容为:

    [[1 0 0]
     [1 1 1]
     [1 2 4]
     [1 3 9]]
    
  2. 批量求解所有行的回归系数
    使用np.linalg.lstsq直接对整个DataFrame进行拟合,该函数支持二维输入,可一次性处理所有行的Y值:

    # 转置df是为了让Y的维度与设计矩阵匹配,最后再转置回原行顺序
    coeffs = np.linalg.lstsq(X_design, df.T, rcond=None)[0].T
    
  3. 验证结果
    打印拟合得到的系数,与iterrows的结果完全一致:

    print(coeffs)
    

    输出:

    [[-1.25  1.25  9.75]
     [-0.5   6.1  11.1 ]
     [ 0.75 -6.15 31.35]]
    

优势说明

这种向量化方法完全避免了Python循环,所有计算都在底层的C优化实现中完成,对于行数较多的大型DataFrame,速度提升可达数十倍甚至上百倍。如果需要拟合更高次的多项式,只需调整range(3)中的数字(比如三次多项式用range(4))即可。

内容的提问来源于stack exchange,提问作者younggotti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:32