我已经加载了一个包含3列的CSV:时间戳,用户ID和campaignID。 每个用户都有> 1个带有时间戳的campaignID。原始数据如下所示:
date user_id ad_campaign
0 2018-01-10 0:21:09 151312395 Search - Special
1 2018-01-10 0:21:19 151312395 Display - Branding
2 2018-01-10 0:21:32 151312395 Display - Branding
3 2018-01-10 0:21:09 151312395 Search - Special
4 2018-01-10 0:21:19 151312395 Display - Branding
5 2018-01-10 0:21:32 151312395 Display - Branding
6 2018-01-30 19:18:37 158490415 Display
7 2018-01-30 19:19:03 158490415 Display
8 2018-01-31 1:36:12 158490415 Branding
我的目标是映射每个用户的不同campaignID的顺序,以便分析哪个广告系列经常出现在第一个,第二个,最后一个等等。 我删除了重复项,订购了时间戳,按用户ID分组,并将每个用户的campaignID放在一个数组中。 现在,我希望有一个循环遍历每个用户的数组,然后为每个用户分配一个“地点”,如第1,第2,第3(之后的步骤,将根据在哪里将每个广告系列的分数归因于用户之旅,让我的目标更加明确)。这是我现在的代码:
import pandas as pd
import numpy as np
import datetime
import os
import matplotlib.pyplot as plt
columnnames = ['date','user_id', 'ad_campaign']
df=pd.read_csv(r'C:\Users\L\Desktop\Data.csv' ,
sep='\t',names = columnnames, usecols=[0,1,4],
parse_dates=True)
df=df.drop_duplicates(subset=['user_id','date', 'ad_campaign'])
df=df.set_index('date').sort_index()
df=(df.groupby(['user_id'])['ad_campaign'].apply(list))
print(df)
现在数据如下:
user_id
151312395 [Search - Special, Display - Branding, Display...
158490415 [Display, Display, Branding, Display, Display,...
176204518 [Display, Display, Display, Display, Pathfinde...
182053572 [Branding, Branding, Branding, Display]
我已尝试使用iterrows,itertuples,itervalues等进行循环,但我认为我遗漏了一些关于存储此数据的方法,因为我不断遇到不同的错误。我应该使用什么样的循环?
答案 0 :(得分:3)
我会做得更好。让我们放弃中间列表列表(它真的难以使用,并且提供零性能优势)。相反,请为每个广告系列标记其唯一的序列号(使用groupby
+ cumcount
完成),然后您可以通过广告系列做一些简单的分组mean
。
df = df.sort_values(by='date')
(df.groupby(['user_id'], sort=False)
.cumcount()
.groupby(df.ad_campaign)
.mean()
.sort_values(ascending=True)
)
ad_campaign
Display 0.5
Search - Special 0.5
Branding 2.0
Display - Branding 3.5
dtype: float64