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