如何解决Pandas Series调用apply执行polyfit拟合时的报错问题?
错误原因分析
apply()方法遍历Series时,传入lambda函数的参数是单个元素值,你之前的写法把整个Series传入linear_trend函数,导致np.polyfit接收的输入维度不匹配,触发类型错误。np.polyfit做一阶拟合返回的是长度为2的数组(第一个元素是斜率,第二个是截距),直接将数组赋值给DataFrame的单列,会触发数组元素赋值的序列错误。- 第一种写法里你把a定义成了和原Series等长的Series,传入polyfit时直接传入整个Series作为输入,维度完全不匹配,自然报错。
解决方案
根据你的需求(固定第一个值和其余每个值分别拟合,再求均值),提供两种可直接运行的实现:
方案1:保存每次拟合的斜率、截距,再计算均值
适合需要留存每一次拟合结果的场景:
import numpy as np import pandas as pd # 取固定的第一个基准值,注意统一你的DataFrame变量名,避免df和df_plot混用 a = df['sensor'].iloc[0] def linear_trend(a,b): return np.polyfit([1,2],[a,b],1) # 遍历每个元素做拟合 fit_results = df['sensor'].apply(lambda b: linear_trend(a, b)) # 拆分斜率、截距为单独的列 df['slope'] = fit_results.apply(lambda x: x[0]) df['intercept'] = fit_results.apply(lambda x: x[1]) # 计算所有拟合结果的均值 slope_mean = df['slope'].mean() intercept_mean = df['intercept'].mean()
方案2:直接计算最终均值,不需要留存中间拟合结果
a = df['sensor'].iloc[0] # 直接遍历所有值拟合后取斜率求均值 slope_mean = df['sensor'].apply(lambda b: np.polyfit([1,2],[a,b],1)[0]).mean()
内容的提问来源于stack exchange,提问作者josseossa
相关产品推荐
相关产品推荐

