如何将循环生成的线性回归结果追加至Pandas DataFrame?
问题解决:DataFrame.append()参数错误修正
错误原因
你代码里的result.append("product", "slope", "intercept", "rvalue", "pvalue")完全不符合pandas的API要求:DataFrame.append()只接受数据对象(字典、Series、DataFrame等)作为第一个参数,额外参数只有ignore_index、verify_integrity、sort,直接传多个字符串会触发参数数量错误。
正确实现方式
方式1:循环内追加字典(简单直观)
把当前产品的线性回归结果封装成字典,键对应DataFrame的列名,值对应计算出的结果,调用append时指定ignore_index=True避免索引冲突:
import pandas as pd import numpy as np from scipy.stats import linregress result = pd.DataFrame() for prod in product_array: data_aggr_period_prod_loop = data_aggr_period_prod.loc[data_aggr_period_prod['product']==prod].sort_values('period') if len(data_aggr_period_prod_loop) > 1: x = np.array([date_map[ix] for ix in data_aggr_period_prod_loop['period']]) y1 = np.array(data_aggr_period_prod_loop['npi']) slope, intercept, rvalue, pvalue, _ = linregress(x, y1) # 修正:用字典封装数据,追加到结果DataFrame result = result.append({ "product": prod, "slope": slope, "intercept": intercept, "rvalue": rvalue, "pvalue": pvalue }, ignore_index=True)
方式2:先收集结果到列表,最后一次性生成DataFrame(效率更高)
pandas的append()每次都会创建新的DataFrame,循环多次调用会降低性能。更优的做法是先把所有结果存入列表,最后统一转成DataFrame:
import pandas as pd import numpy as np from scipy.stats import linregress # 初始化空列表存储结果 result_list = [] for prod in product_array: data_aggr_period_prod_loop = data_aggr_period_prod.loc[data_aggr_period_prod['product']==prod].sort_values('period') if len(data_aggr_period_prod_loop) > 1: x = np.array([date_map[ix] for ix in data_aggr_period_prod_loop['period']]) y1 = np.array(data_aggr_period_prod_loop['npi']) slope, intercept, rvalue, pvalue, _ = linregress(x, y1) # 将结果追加到列表 result_list.append({ "product": prod, "slope": slope, "intercept": intercept, "rvalue": rvalue, "pvalue": pvalue }) # 最后一次性生成DataFrame result = pd.DataFrame(result_list)
补充说明
- 注意从
scipy.stats.linregress返回的rvalue是相关系数,若需要决定系数(R²)可以计算rvalue ** 2。 - 若你的pandas版本≥2.0,
append()方法已被标记为弃用,推荐用列表收集后转DataFrame的方式(本质和pd.concat效率一致)。
内容的提问来源于stack exchange,提问作者user20602598
相关产品推荐
相关产品推荐

