【问题标题】:Pandas Implement Equation & Groupby 2 ConditionsPandas 实现 Equation & Groupby 2 条件
【发布时间】:2021-06-16 15:53:26
【问题描述】:

我的数据如下所示,我正在尝试按站点名称和年份计算 CRMSE(居中均方根误差)。也许我需要一个 agg 函数或 lambda 函数来在每个 groupby 参数(植物名称、年份)处执行此操作。 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  

我需要通过植物名称和年份实现的方程式如下所示:

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

【问题讨论】:

    标签: pandas group-by calculation


    【解决方案1】:

    使用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
    

    另见:

    【讨论】:

    • 这太好了,我不确定我是否理解它以及如何将输出分配给新的 df?谢谢!
    • 好的,我已经将输出保存到变量中没问题。如果你有时间,你能在 3 个部分中解释你的答案吗?
    猜你喜欢
    • 2020-10-05
    • 2018-07-22
    • 2019-08-10
    • 1970-01-01
    • 2021-09-13
    • 2018-09-29
    • 2020-03-03
    • 2019-08-11
    • 2019-04-10
    相关资源
    最近更新 更多