我遇到一个问题,我必须总结大量数据并将其分为三列来汇总数据。问题是一个特定的列也需要应用特定的公式。
我的数据如下:
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)
答案 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
我不确定你要对群组做什么,但似乎你应该拥有所有工具来解决它。