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 - 按用户统计一系列交易活动 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章