尝试完成以下操作,但在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
答案 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
循环快得多,尽管我没有比较特定情况下的性能。