如何找到 Pandas 数据框中两列之间的最佳拟合线,但按每个单独的组 (Python) 拆分?

How to find best-fit line between two columns in Pandas Dataframe, but split up by each individual group (Python)?

我有一个 DataFrame,简化后看起来像:

ID X Y
2 0 0
2 1 3.3
2 4 9
2 6 12
7 0 0.2
7 2 1
7 3 6
7 5 7
7 7 9

但是,有更多的列(总共 19 个)包含其他信息,并且有数千行,有 70+ 个独特的 'ID' 数字.

我想要的是,对于每个 ID 'group',计算 X 和 Y 之间的最佳拟合线,并将该信息存储为如下内容:

ID Slope Intercept R2
2 1.95 0.70 0.99
7 1.34 0.08 0.88

它总结了每个 'ID' 的最佳匹配信息。这里的斜率和截距是线性最佳拟合线的斜率和截距,R2 是某些误差度量的 R 平方值。

我当然可以使用以下方法手动执行此操作:

import scipy
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(a, b)
r2 = r_value**2

这就是我在第二个 table 中填写的方式。但是我如何为每个 'ID' 组中的所有行自动执行此操作?我想以某种方式使用 df.groupby('ID'),但我不知道如何大规模结合这两种方法...

欢迎任何帮助,谢谢!

您可以按 ID 分组,然后使用 apply:

res = df.groupby('ID').apply(lambda x: scipy.stats.linregress(x['X'], x['Y']))
stats_df = pd.DataFrame(res.tolist(), index=res.index).reset_index().round(2)

输出:

>>> stats_df
   ID  slope  intercept  rvalue  pvalue  stderr
0   2   1.95       0.70    0.99    0.01    0.17
1   7   1.34       0.08    0.94    0.02    0.28