Pandas使用groupby迭代数组

时间:2018-05-01 13:50:31

标签: python pandas

我已经加载了一个包含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等进行循环,但我认为我遗漏了一些关于存储此数据的方法,因为我不断遇到不同的错误。我应该使用什么样的循环?

1 个答案:

答案 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