将单独的函数应用于我的Dataframe,同时还对特定列进行求和

时间:2016-12-12 18:49:08

标签: python pandas

我遇到一个问题,我必须总结大量数据并将其分为三列来汇总数据。问题是一个特定的列也需要应用特定的公式。

我的数据如下:

Account Format  Network  Impressions Clicks Cost    Avg. position
Health1 Text     Search        2       0      0.5       1
Health1 Picture  Search        5       2      1        1.5
Health1 Picture  Search        1       2      3        2.4
Health1 Text     Search        1       0      0        2.3
Health1 Text     Display       2       0      0.7      1.7
Health2 Text     Display       0       0      0        3.3
Health2 Text     Display       2       2      4        3.3
Health2 Picture  Search        2       0      0        3.4
.....

因此,我需要按帐户,格式和网络进行分组,并总结展示次数,费用和点击次数,并汇总每个小组:

Account Format  Network  Impressions Clicks Cost    Avg. position
Health1 Text     Search        3       0      0.5       x
Health1 Picture  Search        6       4      4         x
Health2 Text     Display       2       2      4         x
Health2 Picture  Search        2       0      0         x
.....

然而,计算平均值。位置我需要应用一个公式,我的大脑有点像整天这样的东西炒,所以任何帮助将是一个救命。平均位置列需要应用此公式:

  

总和(展示次数*平均排名)/总和(展示次数)

我的尝试是乘以平均值。按行按展示位置列,将列与其他列一起汇总,然后除以总计展示次数。这显然是不正确的,因为它返回值< 1,这不是我正在使用的数据上下文中的可能输出。

frame['Avg. position'] = frame.apply(lambda x: (x['Impressions']*x['Avg. position']), axis=1)
frame = frame.groupby(['Account', 'Format', 'Network'])['Impressions','Clicks','Cost','Avg. position'].sum().reset_index()

frame['Avg. position'] = frame.apply(lambda x: (x['Avg. position']/x['Impressions']) if x['Impressions'] > 0 else '', axis=1)

frame.to_csv(yesterday_date+'.csv', index=False)

1 个答案:

答案 0 :(得分:1)

正确的使用方式适用于更新您的平均值。位置"专栏是这样的:

denominator = frame['Impressions'].sum()
frame['Avg. position'] = frame[['Impressions', 'Avg. position']].apply(lambda x: x[0] * x[1] / denominator, axis=1)

但是......对于Series对象,您可以使用逐个元素的操作:

frame['Avg. position'] = frame['Impressions'] * frame['Avg. position'] / frame['Impressions'].sum()

这意味着您也可以这样做:

frame['Cost'] = frame['Cost'] / 1000000

我不确定你要对群组做什么,但似乎你应该拥有所有工具来解决它。