如何将groupby+sklearn线性回归的model.score结果保存为带分组名的DataFrame
问题:为每个分组生成线性回归R²分数并保存为DataFrame
我有一个包含99个分组的数据集,以下是3个分组的示例子集:
Name conc height 0 Oxaloacetate 20 9047 1 Oxaloacetate 50 24966 2 Oxaloacetate 100 47028 3 L-Glutamine 50 492567 4 L-Glutamine 100 553082 5 L-Glutamine 20 202931 6 L-Lysine 50 334892 7 L-Lysine 100 367027 8 L-Lysine 20 155603
我的目标是为每个分组单独计算线性回归的R²分数。我尝试用groupby和sklearn的LinearRegression实现,但只能打印出R²值,无法将结果整理成包含化合物名称和对应R²分数的DataFrame,期望格式如下:
Name R2 0 Oxaloacetate 0.7663021592216027 1 L-Glutamine 0.7484017413491248 2 L-Lysine 0.9974783003289882
我现有代码如下:
import numpy as np import matplotlib.pyplot as plt # To visualize import pandas as pd # To read data from sklearn.linear_model import LinearRegression df = pd.read_csv ('name.csv')
def regress(df, X, y): model = LinearRegression() X = df.iloc[:, 1].values.reshape(-1, 1) y = df.iloc[:, 2].values.reshape(-1, 1) model.fit(X, y) r_squared = model.score(X, y) print(r_squared)
df.groupby('Name').apply(regress, y, X)
运行后仅输出R²数值:
0.7663021592216027 0.7484017413491248 0.9974783003289882
我无法将这些输出转换为目标格式的DataFrame,希望得到帮助。
解决方案
核心问题是现有函数只打印R²值,没有返回可被groupby.apply收集的结构化结果。修正步骤如下:
修正后的代码
import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression df = pd.read_csv('name.csv') def regress(group): # 从当前分组提取特征和目标变量 X = group['conc'].values.reshape(-1, 1) y = group['height'].values.reshape(-1, 1) # 训练线性回归模型并计算R² model = LinearRegression() model.fit(X, y) r_squared = model.score(X, y) # 返回包含R²值的Series,用于groupby自动合并 return pd.Series({'R2': r_squared}) # 分组计算后重置索引,得到目标格式的DataFrame r2_results = df.groupby('Name').apply(regress).reset_index() print(r2_results)
关键说明
- 移除原函数中冗余的
X、y参数,直接从分组对象中提取指定列,逻辑更清晰 - 函数返回
pd.Series,groupby.apply会自动将每个分组的结果合并为以Name为索引的DataFrame - 调用
reset_index()将Name从索引转为普通列,完全匹配你期望的输出格式
输出示例
Name R2 0 Oxaloacetate 0.766302 1 L-Glutamine 0.748402 2 L-Lysine 0.997478
内容的提问来源于stack exchange,提问作者r brad
相关产品推荐
相关产品推荐

