Pandas - 用户计算Vectorize系列交易活动

时间:2018-03-25 01:25:44

标签: python pandas data-science

尝试完成以下操作,但在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
...

其中第一列是userid,前面的列是每个唯一事件类型的计数(大约有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.count columns

1 个答案:

答案 0 :(得分:2)

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

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