如何找到 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
我有一个 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