如何在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)
问题出在:
- 索引逻辑错误:
df["ple"][columns]完全不符合Pandas的索引规则,实际只取到了第一行的数据 - 没有聚合同位置元素:原代码没把三行列表的同位置值凑成一组,导致线性回归的输入不匹配(自变量是3个值,因变量也需要对应3个值)
最优实现方法
核心思路
- 对每一列,把三行的列表转成二维数组——行对应原DataFrame的行,列对应原列表的同位置元素
- 遍历这个二维数组的每一列(也就是每个位置的元素组),执行线性回归
- 把所有结果存起来方便后续分析
完整代码
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
相关产品推荐
相关产品推荐

