Python groupby后,如何计算不同组的平均相对误差?

Python groupby后,如何计算不同组的平均相对误差?,python,aggregate,mean,Python,Aggregate,Mean,我正在做一个处理大型数据集的项目。然而,现在我只想做一个简单的比较,我找不到我该怎么做。简单地说,我的问题如下。我有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_

我正在做一个处理大型数据集的项目。然而,现在我只想做一个简单的比较,我找不到我该怎么做。简单地说,我的问题如下。我有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组平均值-第三行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\u proc
函数未在
B列上进行聚合。进行聚合的一种方法可以是:

aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_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
尽管如此,
apply()
可以与
df
groupy\u proc
结合使用。计算平均相对误差的函数可以是:

aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_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)
希望这有帮助。为了提高效率,可以考虑只创建一个工具字典,修改<代码> MeNyRelyError()/<代码>函数< /P>
更新:

以下是计算对我有效的平均绝对误差的代码:

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,列=[“A”、“B”、“C”])
聚合过程=('mean','median',lambda x:x.mode().iloc[0])
groupy_proc=df.groupby('A',as_index=False)['B'].agg(聚合_proc)
groupy_proc.columns=['mean','median','mode']
def平均相对误差(x):
统计数据=[“平均值”、“中值”、“模式”]
平均值=groupy_proc.loc[x['A'],stats]
返回值(平均值-x['B'])
列\名称\诊断=['ae \诊断平均值','ae \诊断中值','ae \诊断模式']
df[列名称诊断]=df.apply(平均相对误差,轴=1)
[MAE_diag_mean,MAE_diag_median,MAE_diag_mode]=df[columns_names_diag].sum()/len(df['ae_diag_mean']
打印(MAE_diag_模式)
-> -2.2857142857142856

如果您创建另一个图表来描述您想要的外观,可能会有所帮助,因为我在可视化最终产品时遇到了问题。哦,是的!我完全明白!非常感谢你的帮助,真的!只有一个问题,这本词典是干什么用的?@bonaqua dictionary用于存储意思,用于更快的查找。它可以是
{x:mean(x)}
格式,其中
x
A
列的一个元素@bonaqua这是否回答了您的问题?如果是,请随时接受答案!干杯我用新代码更新了我的问题!但是现在我有一个错误。我不知道你是否能帮我,但你知道为什么会这样吗?@bonaqua我看不出代码有任何错误,除了
stats=['mean','median',lambda x:x.mode().iloc[0]]
。尝试将
groupy\u diag
的最后一列重命名为合适的名称,如
mode
,并在
absolute\u error\u diag()函数中使用该名称而不是lambda函数。因此,新的赋值看起来像
stats=['mean','median','mode']