【问题标题】:How to do the mean relative error for different groups after groupby?groupby后如何计算不同组的平均相对误差?
【发布时间】:2020-05-01 17:07:57
【问题描述】:

我正在做一个处理大型数据集的项目。但是,现在我只想进行比较,但我找不到如何做到这一点。简单来说一个更简单的问题,我的问题如下。我有 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 组平均值 - 第 2 行 B 值)/ h 组平均值 对于第 3 行 (第 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'])

【问题讨论】:

  • 如果您创建另一个图表来说明您希望它的外观,这可能会有所帮助,因为我无法将最终产品可视化。

标签: python aggregate mean


【解决方案1】:

问题中的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() 可以与dfgroupy_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

【讨论】:

  • 哦,是的!我完全明白了!非常感谢您的帮助,真的!只有一个问题,字典是干什么用的?
  • @bonaqua 用于存储手段的字典,用于更快地查找。它可以是{x:mean(x)} 的格式,其中x 是列A 的一个元素。
  • @bonaqua 这能回答你的问题吗?如果是,请随时接受答案!干杯!
  • 我用新代码更新了我的问题!但是现在我有一个错误。我不知道您是否可以帮助我,但是您知道为什么会出错吗?
  • @bonaqua 我看不出代码有什么问题,除了stats = ['mean', 'median', lambda x: x.mode().iloc[0]]。尝试将groupy_diag 的最后一列重命名为合适的名称,例如mode,并使用该名称代替absolute_error_diag() 函数中的lambda 函数。所以新的分配看起来像stats = ['mean', 'median', 'mode']
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2021-03-22
  • 2020-05-13
  • 2013-12-21
相关资源
最近更新 更多