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

使用Scipy Quad对DataFrame向量化列积分遇KeyError,求解决方案

问题解答

能否对向量化列进行积分?

可以,但不能直接用scipy.integrate.quad处理离散的DataFrame列。quad是针对标量输入、标量输出的连续函数设计的,而向量化列是离散的采样点集合,需要先转换为连续函数,或者改用针对离散数据的积分方法。

报错原因

你的代码存在两个核心问题:

  1. 传入quad的args参数错误:你把df_115['u/u_delta'](一个Series)传给了函数的df_115参数,导致函数内部试图从Series中取列名'u/u_delta',自然触发KeyError。
  2. 被积函数逻辑错误:quad会逐个传入标量的y值,而你的函数直接返回整个Series,不符合quad对被积函数的要求。

解决方案

方案1:插值转换为连续函数后用quad积分(适合需要高精度连续积分的场景)

先将离散的y和u/u_delta数据拟合为连续函数,再用quad计算积分:

import scipy.integrate as spi
from scipy.interpolate import interp1d

delta_115 = 3.41
# 从DataFrame中提取y和对应的u/u_delta列(假设DataFrame有'y'列)
y_vals = df_115['y']
u_over_udelta_vals = df_115['u/u_delta']

# 生成连续插值函数,支持输入任意y值返回对应的u/u_delta
u_func = interp1d(y_vals, u_over_udelta_vals, kind='linear', fill_value="extrapolate")

# 定义符合quad要求的标量被积函数
def integrand(y):
    return 1 - u_func(y)

# 计算积分
d_star_115, error_115 = spi.quad(integrand, 0, delta_115)

方案2:直接用离散数据积分(适合已有采样点的场景,更简洁)

如果不需要连续函数的高精度积分,可直接用梯形积分法trapz处理离散列:

from scipy.integrate import trapz

# 直接对离散的(1 - u/u_delta)关于y积分
d_star_115 = trapz(1 - df_115['u/u_delta'], x=df_115['y'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:02:54