python - Pandas 使用 groupby 迭代数组

标签 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-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

我的目标是映射每个用户的不同营销事件 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)

数据现在如下所示:

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 等进行循环,但我认为我错过了存储这些数据的方式,因为我不断收到不同的错误。我应该使用什么样的循环?

最佳答案

我会为你做得更好。让我们放弃中间的列表列表示(它确实很难使用并且提供零性能优势)。相反,为每个事件标记其唯一的序列号(使用 groupby + cumcount 完成),然后您可以执行一些简单的操作,例如分组 mean by事件。

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

关于python - Pandas 使用 groupby 迭代数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50117703/

相关文章:

python - 从列表字典中过滤元素

python - 岛屿数量的递归解决方案

python - 使用另一个包含 Python 长度的列表拆分列表

python - PANDAS - 循环两个不同大小的日期时间索引来比较日期和值

python-3.x - 从产品描述中提取数字数据

python - 替代 Python 字符串替换方法

python - 是否有 Pandas 的数据集文件格式可以在多个列上建立索引(即 'database-indexed' ),和/或可以便宜地更新?

python - Pandas assert_frame_equal 行为

python - 获取单元格的值来指示 pandas 中的列名称

python - 如何在 Bokeh 中将 "group by"数据帧绘制为条形图