Python 使用groupby在数组上迭代
我已经加载了一个包含3列的CSV:时间戳、用户ID和活动ID。 每个用户都有>1个带有时间戳的活动ID。原始数据如下所示:Python 使用groupby在数组上迭代,python,pandas,Python,Pandas,我已经加载了一个包含3列的CSV:时间戳、用户ID和活动ID。 每个用户都有>1个带有时间戳的活动ID。原始数据如下所示: 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-0
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
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]
我的目标是为每个用户映射不同活动ID的顺序,以便分析哪个活动通常排在第一、第二、最后等等。
我已经删除了重复项,对时间戳进行了排序,按用户ID分组,并将每个用户的活动ID放入一个数组中。
现在,我希望有一个循环,循环遍历每个用户的数组,然后为每个用户分配一个“位置”,如1、2、3d(之后的步骤是根据每个活动在用户旅程中的位置为每个活动分配分数,以使我的目标更明确)。这是我现在拥有的代码:
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)
现在的数据如下所示:
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
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]
我尝试过使用ItError、itertuples、itervalues等进行循环,但我认为我在存储这些数据的方式上遗漏了一些东西,因为我不断遇到不同的错误。我应该使用哪种循环?我会做得更好。让我们放弃列表表示的中间列(它确实很难使用,并且提供零性能优势)。相反,将每个活动标记为其唯一的序列号(使用
groupby
+cumcount
),然后您可以执行一些简单的操作,如按活动分组的平均值
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
介意将C:\Users\L\Desktop\attribute Data 4.csv
的前5-10行粘贴为问题中的文本吗?当然,可以吗?(实际的CSV数据有很多列,这是我读到的)谢谢,非常有用。谢谢!我还尝试使用min()和max()代替mean(),这同样有效。但是你能帮我理解如何解释这三个吗?我只是想了解,因为我的下一步是一个更复杂的模型,在每个用户序列中将40%归因于第一次战役,40%次到用户序列中的最后一次战役,20%次划分中间的战役(尝试不同的营销归因模型)。我不相信Min或Max在这个上下文中比MID更具意义,它基本上是为每个用户ID平均时间的战役位置。根据你的解释,你可以考虑执行一个加权平均值,这可能有点牵涉其中。你可以为此提出一个新问题,但这是可能的。