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 会与多个列(obsvals
和 modelvals
)交互。因此,我们传递整个数据框,然后使用 .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
我有如下所示的数据,我正在尝试按 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 会与多个列(obsvals
和 modelvals
)交互。因此,我们传递整个数据框,然后使用 .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