我得到了这个样本DF:
df = pd.DataFrame({'CUSTOM_CRITERIA':[1111,22222,1111,1212,1212,3333,5555, 1111],
'AD_UNIT_NAME':['inp2_l_d', 'inp1', 'pixel_d', 'inp2_l_d', 'anchor_m','anchor_m','anchor_m','inp2_l_d'],
'TOTAL_CODE_SERVED_COUNT':[10, 20, 10, 12, 18,500,100,50]})
我需要的条件,其中有更多的代码提供给获得每个custom_criteria最大total_code_served_count - > anchor_m [total_code担任]或inp2_l_d [total_code担任] + pixel_d [total_code服务]每个CUSTOM_CRITERIA
我当前的解决方案如下所示:
data_dict = clean_data.to_dict(orient='records')
for item in data_dict:
desktop_impression_max_calculated = sum([d['TOTAL_CODE_SERVED_COUNT'] for d in data_dict if d['CUSTOM_CRITERIA'] == item['CUSTOM_CRITERIA'] and ('inp2_l_d' in d['AD_UNIT_NAME'].lower() or 'pixel_d' in d['AD_UNIT_NAME'].lower())])
mobile_impression_max_calculated = sum([d['TOTAL_CODE_SERVED_COUNT'] for d in data_dict if d['CUSTOM_CRITERIA'] == item['CUSTOM_CRITERIA'] and 'anchor_m' in d['AD_UNIT_NAME'].lower()])
item['IMPRESSIONS_MAX'] = max(desktop_impression_max_calculated,mobile_impression_max_calculated)
clean_data = pd.DataFrame(data_dict)
agg_map = {'IMPRESSIONS_MAX': 'first' }
clean_data = clean_data.groupby('CUSTOM_CRITERIA').agg(agg_map).reset_index()
由于N ^ 2复杂性,当存在大量数据时,这需要很长时间才能运行。我敢肯定,有一种更好,更简单的方法来处理大熊猫。
您可以通过在值乘以创建两个蒙面列TOTAL_CODE_SERVED_COUNT
由布尔面具柱m1
以及m2
随后,groupby
这些蒙面列CUSTOM_CRITERIA
,并使用聚合sum
,最后拿max
一起axis=1
得到最终的结果是:
m1 = df['AD_UNIT_NAME'].str.contains(r'(?i)inp2_l_d|pixel_d')
m2 = df['AD_UNIT_NAME'].str.contains(r'(?i)anchor_m')
pd.DataFrame((df['TOTAL_CODE_SERVED_COUNT'].values * [m1, m2]).T)\
.groupby(df['CUSTOM_CRITERIA']).sum().max(1).reset_index(name='IMPRESSIONS_MAX')
CUSTOM_CRITERIA IMPRESSIONS_MAX
0 1111 70
1 1212 18
2 3333 500
3 5555 100
4 22222 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句