首页 > 解决方案 > Pandas RMSE Groupby 多个条件

问题描述

我正在尝试根据多个条件计算熊猫数据帧的 RMSE:(植物名称、年份、月份)。我的数据帧(df3m)如下所示:

  plant_name  year  month    obsvals  modelvals
0  ARIZONA I  2021      1   8.900582   8.298038
1  ARIZONA I  2021      2   7.976660   7.410446
2  ARIZONA I  2021      3  10.803689  11.480000
3  CAETITE I  2021      1   9.104309   7.778750
4  CAETITE I  2021      2   6.054558   6.022783

我尝试按植物名称、年份、月份分组,然后使用“mean_squared_error”应用

from sklearn.metrics import mean_squared_error

我尝试这样做的一行代码看起来像这样......也许我需要在这里定义一个函数?

rmse = df3m.groupby(['plant_name']) 
[['obsvals','modelvals']].mean_squared_error(squared = False) #for rmse use "False"

使用上面我得到这个错误:

 AttributeError: 'DataFrameGroupBy' object has no attribute 'mean_squared_error'

我的最终输出应如下所示:

plant_name      year       rmse 
0   ARIZONA I   2021         ? 
1   CAETITE I   2021         ?

感谢您的时间,

标签: pythonpandasconditional-statements

解决方案


您可以使用.GroupBy.apply()并将调用mean_squared_error放入其中,如下所示:

df_out = (df3m.groupby(['plant_name','year','month'])[['obsvals','modelvals']]
              .apply(lambda x: mean_squared_error(x['obsvals'], x['modelvals'], squared=False))
         ).to_frame(name='rmse').reset_index()

结果:

print(df_out)

  plant_name  year  month      rmse
0  ARIZONA I  2021      1  0.602544
1  ARIZONA I  2021      2  0.566214
2  ARIZONA I  2021      3  0.676311
3  CAETITE I  2021      1  1.325559
4  CAETITE I  2021      2  0.031775

编辑

根据问题的编辑以仅使用plant_nameand获得预期结果year,我们可以修改上面的代码以排除分组 by month,如下所示:

df_out2 = (df3m.groupby(['plant_name','year'])[['obsvals','modelvals']]
              .apply(lambda x: mean_squared_error(x['obsvals'], x['modelvals'], squared=False))
         ).to_frame(name='rmse').reset_index()

结果:

print(df_out2)

  plant_name  year      rmse
0  ARIZONA I  2021  0.616726
1  CAETITE I  2021  0.937581

推荐阅读