在熊猫中使用矢量化对值进行计数并将结果插入数据框

问题描述

我有一个数据表,其中有35k +行,格式如下:

+----------+---------+--------------+
| username |  event  | points_value |
+----------+---------+--------------+
| user1    | event_1 | 100          |
| user2    | event_2 | 120          |
| user2    | event_1 | 100          |
| ...      | ...     | ...          |
+----------+---------+--------------+

不确定是否相关,但是有20个可能的事件,并且每个用户可能发生一次以上的事件。数据是根据事件的时间而不是用户名或事件类型进行排序的。我正在计算每个用户的事件数(以及每个用户和事件增加的点数,但这是一个问题,可以通过解决以下问题来解决)。

我的输出数据帧events_total_df使用以下格式:

+----------+---------+---------+-----+----------+
| username | event_1 | event_2 | ... | event_20 |
+----------+---------+---------+-----+----------+

(我已经用用户名预填充了events_total_df数据框,并在每个事件列中填充了0)

我已经有解决该问题的方法:

for index,row in df.iterrows():
    event_totals_df.loc[event_totals_df.username.eq(row['username']),row['event']] += 1

但是,这是一个非常慢的解决方案。当前的数据表包含35k +行(为期一周的活动),需要几分钟才能完成。我已经做过一些研究,似乎矢量化是要走的路,因为它要快得多。但是,我无法正常工作。理想情况下,我想做的是这样的:

event_group = df.groupby('event')
for event in list(event_group.groups.keys()):
    event_totals_df[event] = len(df.loc[ event_group.get_group(event)['username'] == event_totals_df['username'] ])

但是,当我运行代码时,出现以下错误:

ValueError: Can only compare identically-labeled Series objects

这有道理。有什么方法可以完成我要使用向量化处理的工作吗?我乐于更改任何基本内容以加快速度。但是我认为如何处理输出数据帧不是问题吗?

解决方法

尝试使用数据透视表:

import pandas as pd
result = pd.pivot_table(df,values=['points_value'],index=['user'],columns=['event'],aggfunc={'points_value':'sum'}).reset_index()

这将汇总每个用户每个事件的所有分数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...