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

2024-05-19 22:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个处理大型数据集的项目。然而,现在我只想做一个简单的比较,我找不到我该怎么做。简单地说,我的问题如下。我有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'])

Tags: columnslambdadfnamesmodeerrorprocmean
1条回答
网友
1楼 · 发布于 2024-05-19 22:26:39

问题中的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)

希望这有帮助。为了提高效率,可以考虑只创建一个方法字典,修改^ {< CD6>}函数


更新:

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

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

相关问题 更多 >