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

如何在Pandas DataFrame中遍历行列同位置元素组合执行线性回归

需求与解决方案

需求描述

我有一个3行3列的Pandas DataFrame(名为df),每个单元格里都是一个数值列表(比如[-1.10037122, -1.12865588, -0.70395085, ...])。需要完成以下操作:

  • 先处理第一列ple:把三行中每个列表的同位置元素凑成一组(比如第一组是interoception行第1个值、exteroception行第1个值、cognitive行第1个值)
  • 对每一组元素,用roi_range = np.array([0,1,2])作为自变量做线性回归
  • 遍历完当前列所有位置后,把逻辑扩展到所有三列

现有代码的问题

当前代码只能打印第一行的列表,还跑不通线性回归:

df = pd.DataFrame(data=dict_data) # the dataframe
roi_range = np.array([0, 1, 2]) # three positions for the linear regression
rows = ["interoception", "exteroception", "cognitive"] # the row names

for i in df["ple"][columns]:
    print(i) # currently only prints the values of the first row
    slope, intercept = sp.stats.linregress(roi_range, i)

问题出在:

  1. 索引逻辑错误:df["ple"][columns]完全不符合Pandas的索引规则,实际只取到了第一行的数据
  2. 没有聚合同位置元素:原代码没把三行列表的同位置值凑成一组,导致线性回归的输入不匹配(自变量是3个值,因变量也需要对应3个值)

最优实现方法

核心思路

  1. 对每一列,把三行的列表转成二维数组——行对应原DataFrame的行,列对应原列表的同位置元素
  2. 遍历这个二维数组的每一列(也就是每个位置的元素组),执行线性回归
  3. 把所有结果存起来方便后续分析

完整代码

import pandas as pd
import numpy as np
import scipy.stats as sp

# 初始化DataFrame(假设dict_data是你的原始数据)
df = pd.DataFrame(data=dict_data, index=["interoception", "exteroception", "cognitive"])
roi_range = np.array([0, 1, 2])

# 存储所有列的回归结果
all_reg_results = {}

# 遍历每一列
for col in df.columns:
    # 把当前列的所有列表转成二维numpy数组
    column_data = np.array(df[col].tolist())
    col_results = []
    
    # 遍历每个位置的元素组(二维数组的列就是同位置元素)
    for pos_values in column_data.T:
        # 执行线性回归,获取完整结果
        reg_result = sp.stats.linregress(roi_range, pos_values)
        # 把结果整理成字典方便查看
        col_results.append({
            "slope": reg_result.slope,
            "intercept": reg_result.intercept,
            "r_squared": reg_result.rvalue ** 2,
            "p_value": reg_result.pvalue,
            "std_err": reg_result.stderr
        })
    
    all_reg_results[col] = col_results

# 示例:打印ple列前3个位置的回归结果
print("ple列前3个位置的回归结果:")
for idx, res in enumerate(all_reg_results["ple"][:3]):
    print(f"位置{idx}: 斜率={res['slope']:.4f}, 截距={res['intercept']:.4f}, R²={res['r_squared']:.4f}")

关键细节

  • 数组转换:np.array(df[col].tolist())把列里的列表转成二维数组,转置.T后就能直接拿到每个位置的三行元素组
  • 回归输入匹配:每个pos_values都是长度为3的数组,和roi_range长度一致,刚好满足线性回归的输入要求
  • 结果存储:用字典嵌套列表的结构保存所有结果,后续可以轻松查询任意列任意位置的回归参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:40:32