Pandas - 按用户计算矢量化一系列交易活动

Pandas - Count Vectorize Series of Transaction Activities by User

尝试完成以下内容,但在 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,但坚持将结果扩展到计数向量 a.k.a。计数列

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 循环快得多,尽管我没有比较您的具体情况下的性能。