使用 group by 计算聚合平均值

compute aggregated mean with group by

我有这样一个数据框数据:

Cluster VolumePred      ConversionPred
0   0-3     8.0          7.0
1   0-3     175.0       85.0
2   0-3     17           4.0
3   4-6     14           4.0
4   7-9     29.0        19.0

我需要添加一列“meanKPI”,它等于“ConversionPred”的总和除以按“Cluster”分组的“VolumePred”的总和。

我试过这个:

def KPI_Pred_mean(x, y):
    #print (x)
    return (x.sum()/y.sum())
    
    #data.ConversionPred.sum()/sum_vol_pred
    
df3=data.groupby(['Cluster'])['ConversionPred', 'VolumePred'].apply(KPI_Pred_mean).reset_index() 

但是我得到一个错误:

TypeError: KPI_Pred_mean() missing 1 required positional argument: 'y'

我该如何解决这个问题?

将你的调用apply自定义功能改为

out = df.groupby(['Cluster']).apply(lambda x : KPI_Pred_mean(x['ConversionPred'],x['VolumePred'])) .reset_index(name = 'KPI_Pred_mean') 
Out[267]: 
  Cluster  KPI_Pred_mean
0     0-3       0.480000
1     4-6       0.285714
2     7-9       0.655172

KPI_Pred_mean 需要两个参数,您将函数作为 lambda 传递给 apply 的方式可以重写为:.apply(lambda x: KPI_Pred_mean(x)。这意味着它缺少 y 变量。您可以通过两种方式重写代码:

1 - 重写 lambda

df3=data.groupby(['Cluster'])['ConversionPred', 'VolumePred'].apply(lambda x: KPI_Pred_mean(x["ConversionPred"], x["volumePred"]).reset_index(name = 'KPI_Pred_mean') 

2 - 重写你的函数

def KPI_Pred_mean(row):
    return (row["ConversionPred"].sum()/row["volumePred"].sum())

1 号可能更好,因为它使您的函数保持美观和通用。