分组方式,应用函数,并插入具有相应值的新列

2024-06-30 16:19:53 发布

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

我试图为某些用户群计算加权平均值,但似乎无法获取输出并用它形成一个新的列。你知道吗

我尝试了groupby和apply函数,但似乎无法将其转换回新的列

 df = pd.DataFrame('cohort_size': [10,15,20,25,20,15],
'retention' : [0.3,0.2,0.4,0.5,0.6,0.5],
'nth_interval' : [1,1,1,7,7,7])

df.groupby('nth_interval').apply(lambda x: np.average(x['retention'], weights=x['cohort_size']))

我得到的输出是一个序列,但我真正想要的是取这些单独的加权平均值,并将它们作为数据帧中的一个新列放回去,其中每个列值对应于第n个间隔


Tags: lambda函数dataframedfsizenp平均值pd
3条回答

IIUC,你在找这个吗?你知道吗

df.merge(df.groupby('nth_interval').apply(lambda x: np.average(x['retention'],
                                                   weights=x['cohort_size']))
                                   .rename('wgted_avg').reset_index(), 
         on='nth_interval')

输出:

   cohort_size  retention  nth_interval  wgted_avg
0           10        0.3             1   0.311111
1           15        0.2             1   0.311111
2           20        0.4             1   0.311111
3           25        0.5             7   0.533333
4           20        0.6             7   0.533333
5           15        0.5             7   0.533333

您可以使用transform保存合并。对于大数据,您通常希望防止这种情况发生。你知道吗

df['weighted_avg'] = df.groupby('nth_interval')['retention']
    .transform(lambda x: np.average(x, weights=df.loc[x.index, 'cohort_size']))

至于loc是怎么工作的。loc是一种获取数据子集的方法。您可以给它一个标签、索引或布尔索引。第一个参数用于行,第二个参数用于列。在这里,我使用保留序列组的索引来获得相应的队列大小。基本上我是在给df.loc[[0, 1, 2], 'cohort_size']df.loc[[3, 4, 5], 'cohort_size']打电话。你知道吗

您可以执行合并:

df.merge(df.groupby('nth_interval')
           .apply(lambda x: np.average(x['retention'], weights=x['cohort_size']))
           .to_frame(name='average'),
         on='nth_interval')

或地图:

s = df.groupby('nth_interval')
               .apply(lambda x: np.average(x['retention'], weights=x['cohort_size']))

df['average'] = df['nth_interval'].map(s)

输出:

   cohort_size  retention  nth_interval   average
0           10        0.3             1  0.311111
1           15        0.2             1  0.311111
2           20        0.4             1  0.311111
3           25        0.5             7  0.533333
4           20        0.6             7  0.533333
5           15        0.5             7  0.533333

也可以手动计算:

df['average'] = (df['retention'].mul(df['cohort_size'])
                      .groupby(df['nth_interval'])
                      .transform('sum')
                      .div(df['cohort_size'].groupby(df['nth_interval'])
                                            .transform('sum'))
                 )

相关问题 更多 >