groupby之后如何计算不同组的平均相对误差?
How to do the mean relative error for different groups after groupby?
我正在做一个处理大型数据集的项目。但是,现在我只想做一个比较,但我找不到如何做。简单的说一个更简单的问题,我的问题如下。我有 3 个不同的列和 6 行:
A B C
g 1 2
h 2 1
j 3 3
h 3 3
g 4 3
j 5 4
我要做的第一件事是计算 B 的平均值、中位数和模式,同时考虑到 A 的组。所以我这样做了,到目前为止一切顺利:
aggregations_proc = {'C': { 'Mean_proc': 'mean', 'Median_proc': 'median',
'Mode_proc': lambda x: x.mode()}}
groupy_proc = df.groupby('A', as_index=False).agg(aggregations_proc)
但是,我现在的目标只是创建一个新列,表示计算 B 和 C 的平均值之间的每一行的平均相对误差,假设每个组的平均值不同。
例如,对于第一行,相对误差为:
(g 组平均值 - 第 1 行 B 值)/g 组平均值
但是,对于第二行,它已经是
(h组平均值 - 第二行B值)/ h组平均值
对于第三行
(第 j 组平均值 - 第 3 行 B 值)/第 j 组平均值
但这适用于更大的数据集。
非常欢迎任何帮助!
[更新]
这是我的新代码。我认为一切正常,但我猜模式有一些错误。错误是“列的长度必须与键的长度相同”。代码如下:
aggregations_diag = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_diag = df.groupby('A', as_index=False)
['B'].agg(aggregations_diag)
def absolute_error_diag(x):
stats = ['mean', 'median', lambda x: x.mode().iloc[0]]
avg = groupy_diag.loc[x['A'], stats]
return (avg - x['B'])
# Columns for the absolute error of each row
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']
df[columns_names_diag] = df.apply(absolute_error_diag, axis=1)
[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] =
df[columns_names_diag].sum()/len(df['ae_diag_mean'])
问题中的 aggregations_proc
函数不聚合列 B
。进行聚合的一种方法可能是:
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
尽管如此,apply()
可以与 df
和 groupy_proc
结合使用。计算平均相对误差的函数可以是:
def mean_rel_error(x): # x is a row of df
avg = groupy_proc.loc[x['A'], 'mean'] # to find avg, locate 'mean' col in the row corresponding to the value of col A
return (avg - x['B']) / avg
函数调用如下所示:
df['mre'] = df.apply(mean_rel_error, axis=1)
希望这对您有所帮助。为了提高效率,您可以考虑仅创建均值字典并修改 mean_rel_error()
函数
更新:
这是计算对我有用的平均绝对误差的代码:
l = [["g",1,5], ["h",2,2], ["j",3,9], ["g",3,5], ["j",4,3], ["h",5,1], ["g",11,1]]
df = pd.DataFrame(l, columns=["A", "B", "C"])
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
groupy_proc.columns = ['mean', 'median', 'mode']
def mean_rel_error(x):
stats = ['mean', 'median', 'mode']
avg = groupy_proc.loc[x['A'], stats]
return (avg - x['B'])
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']
df[columns_names_diag] = df.apply(mean_rel_error, axis=1)
[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] = df[columns_names_diag].sum()/len(df['ae_diag_mean'])
print(MAE_diag_mode)
-> -2.2857142857142856
我正在做一个处理大型数据集的项目。但是,现在我只想做一个比较,但我找不到如何做。简单的说一个更简单的问题,我的问题如下。我有 3 个不同的列和 6 行:
A B C
g 1 2
h 2 1
j 3 3
h 3 3
g 4 3
j 5 4
我要做的第一件事是计算 B 的平均值、中位数和模式,同时考虑到 A 的组。所以我这样做了,到目前为止一切顺利:
aggregations_proc = {'C': { 'Mean_proc': 'mean', 'Median_proc': 'median',
'Mode_proc': lambda x: x.mode()}}
groupy_proc = df.groupby('A', as_index=False).agg(aggregations_proc)
但是,我现在的目标只是创建一个新列,表示计算 B 和 C 的平均值之间的每一行的平均相对误差,假设每个组的平均值不同。 例如,对于第一行,相对误差为: (g 组平均值 - 第 1 行 B 值)/g 组平均值 但是,对于第二行,它已经是 (h组平均值 - 第二行B值)/ h组平均值 对于第三行 (第 j 组平均值 - 第 3 行 B 值)/第 j 组平均值 但这适用于更大的数据集。
非常欢迎任何帮助!
[更新]
这是我的新代码。我认为一切正常,但我猜模式有一些错误。错误是“列的长度必须与键的长度相同”。代码如下:
aggregations_diag = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_diag = df.groupby('A', as_index=False)
['B'].agg(aggregations_diag)
def absolute_error_diag(x):
stats = ['mean', 'median', lambda x: x.mode().iloc[0]]
avg = groupy_diag.loc[x['A'], stats]
return (avg - x['B'])
# Columns for the absolute error of each row
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']
df[columns_names_diag] = df.apply(absolute_error_diag, axis=1)
[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] =
df[columns_names_diag].sum()/len(df['ae_diag_mean'])
问题中的 aggregations_proc
函数不聚合列 B
。进行聚合的一种方法可能是:
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
尽管如此,apply()
可以与 df
和 groupy_proc
结合使用。计算平均相对误差的函数可以是:
def mean_rel_error(x): # x is a row of df
avg = groupy_proc.loc[x['A'], 'mean'] # to find avg, locate 'mean' col in the row corresponding to the value of col A
return (avg - x['B']) / avg
函数调用如下所示:
df['mre'] = df.apply(mean_rel_error, axis=1)
希望这对您有所帮助。为了提高效率,您可以考虑仅创建均值字典并修改 mean_rel_error()
函数
更新:
这是计算对我有用的平均绝对误差的代码:
l = [["g",1,5], ["h",2,2], ["j",3,9], ["g",3,5], ["j",4,3], ["h",5,1], ["g",11,1]]
df = pd.DataFrame(l, columns=["A", "B", "C"])
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
groupy_proc.columns = ['mean', 'median', 'mode']
def mean_rel_error(x):
stats = ['mean', 'median', 'mode']
avg = groupy_proc.loc[x['A'], stats]
return (avg - x['B'])
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']
df[columns_names_diag] = df.apply(mean_rel_error, axis=1)
[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] = df[columns_names_diag].sum()/len(df['ae_diag_mean'])
print(MAE_diag_mode)
-> -2.2857142857142856