Pandas 实现 Equation & Groupby 2 条件

Pandas Implement Equation & Groupby 2 Conditions

我有如下所示的数据,我正在尝试按 site_name 和年份计算 CRMSE(居中均方根误差)。也许我需要一个 agg 函数或一个 lambda 函数来在每个 groupby 参数(plant_name,年份)上执行此操作。 df3m1 的数据帧数据:

     plant_name  year  month  obsvals  modelvals  
0     ARIZONA I  2021      1     8.90       8.30  
1     ARIZONA I  2021      2     7.98       7.41  
2     CAETITE I  2021      1     9.10       7.78  
3     CAETITE I  2021      2     6.05       6.02  

我需要通过 plant_name 和年份实现的方程式如下所示:

crmse = df3m1.groupby(['plant_name','year'])((  (df3m1.obsvals - df3m1.obsvals.mean())  - 
(df3m1.modelvals - df3m1.modelvals.mean())  ) ** 2).mean() ** .5

关于如何同时集成 groupby 和计算,这对我来说有点高级。谢谢你。最终数据框如下所示:

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

我已经用 groupby 尝试过这样的事情 -

crmse = df3m1.groupby(['plant_name','year'])((  (df3m1.obsvals - 
df3m1.obsvals.mean())  - (df3m1.modelvals - df3m1.modelvals.mean())  ) 
** 2).mean() ** .5

但得到这样的错误:

TypeError: 'DataFrameGroupBy' object is not callable

使用groupby是正确的。在那之后,我们通常会使用 .agg,但是计算 csrme 会与多个列(obsvalsmodelvals)交互。因此,我们传递整个数据框,然后使用 .apply.

根据需要获取列

代码:

def crmse(x, y):
    return np.sqrt(np.mean(np.square( (x - x.mean()) - (y - y.mean()) )))

def f(df):
    return pd.Series(crmse(df['obsvals'], df['modelvals']), index=['crmse'])

crmse_series = (
    df3m1
    .groupby(['plant_name', 'year'])
    .apply(f)
)

crmse_series 
                 crmse
plant_name year       
ARIZONA I  2021  0.015
CAETITE I  2021  0.645

您可以将序列合并到原始数据框中merge

df = df.merge(crmse_series, on=['plant_name', 'year'])
df
  plant_name  year  month  obsvals  modelvals  crmse
0  ARIZONA I  2021      1     8.90       8.30  0.015
1  ARIZONA I  2021      2     7.98       7.41  0.015
2  CAETITE I  2021      1     9.10       7.78  0.645
3  CAETITE I  2021      2     6.05       6.02  0.645

另请参阅:

  • Apply multiple functions to multiple groupby columns