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

如何将循环生成的线性回归结果追加至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:45:46