Pandas - 按用户统计一系列交易活动 [关闭]

Posted

技术标签:

【中文标题】Pandas - 按用户统计一系列交易活动 [关闭]【英文标题】:Pandas - Count Vectorize Series of Transaction Activities by User [closed] 【发布时间】:2018-09-03 10:16:53 【问题描述】:

尝试完成以下任务,但在 Pandas 中,使用我目前的 numpy-ish 方法,这在 1,000,000 条记录上速度非常慢

csv 中的数据示例:

03530c9197f5845,5/9/14,EmailOpen
03530c9197f5845,5/12/14,EmailOpen
03530c9197f5845,5/19/14,EmailOpen
03530c9197f5845,5/20/14,EmailOpen 
03530c9197f5845,5/27/14,EmailOpen
03530c9197f5845,5/29/14,EmailOpen
03530c9197f5845,6/2/14,PageView
03530c9197f5845,6/2/14,WebVisit  
...

其中第一列是用户哈希,第二列是事件日期,第三列是事件类型

需要的示例输出:

03530c9197f5845, 0, 0, 0, 0, 1, 3, 5, 2, 3, 5
89430s7897r3821, 1, 4, 3, 0, 0, 0, 2, 2, 1, 0
...

其中第一列是用户 ID,后面的列是作为训练特征的每个唯一事件类型(大约有 8 种事件类型)的计数。

下面的代码完成了我正在寻找的东西,但速度很慢:

import pandas as pd
import numpy as np


data = pd.read_csv('myfile.csv').as_matrix()
usersData = [v[0] for v in data]
actionsData = [v[2] for v in data]

actions = set(actionsData)
users = set(usersData)

target = np.zeros((len(users), len(actions)))
for i, user in enumerate(users):
    for j, action in enumerate(actions):
        val = len([d for d in data if d[0] == user and d[2] == action])
        target[i][j] = val

尝试在数据帧上使用 groupby 和 count_values,但坚持将结果扩展为计数向量,即计数列

【问题讨论】:

【参考方案1】:

pandas 中的 pivot_table 函数应该可以满足您的需求。例如:

import pandas as pd

frame = pd.read_csv('myfile.csv', header=None)
frame.columns = ['user_id', 'date', 'event_type']
frame_pivoted = frame.pivot_table(
    index='user_id', columns='event_type', aggfunc='count'
)

一般来说,使用矢量化 Pandas 函数比 for 循环快得多,尽管我没有比较您特定情况下的性能。

【讨论】:

以上是关于Pandas - 按用户统计一系列交易活动 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当用户按下返回按钮关闭活动时保存和恢复活动状态

pandas_查看数据特征和统计信息

pandas_查看数据特征和统计信息

Pandas日期数据处理:如何按日期筛选显示及统计数据

使用 pandas 统计从开始时间起一小时内发生的用户订单,时间间隔不规则

Pandas分组统计与时间序列