Python 在pandas中使用矢量化计算值并将结果插入数据帧

Python 在pandas中使用矢量化计算值并将结果插入数据帧,python,pandas,vectorization,Python,Pandas,Vectorization,我有一个35k+行的数据表,格式如下: +----------+---------+--------------+ | username | event | points_value | +----------+---------+--------------+ | user1 | event_1 | 100 | | user2 | event_2 | 120 | | user2 | event_1 | 100 | |

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

+----------+---------+--------------+
| username |  event  | points_value |
+----------+---------+--------------+
| user1    | event_1 | 100          |
| user2    | event_2 | 120          |
| user2    | event_1 | 100          |
| ...      | ...     | ...          |
+----------+---------+--------------+
+----------+---------+---------+-----+----------+
| username | event_1 | event_2 | ... | event_20 |
+----------+---------+---------+-----+----------+
不确定是否相关,但有20个可能的事件,每个用户可以发生一次以上的事件。数据是根据事件的时间而不是用户名或事件类型进行排序的。我希望计算每个用户的事件数(以及每个用户和事件添加的点数,但这是一个问题,我将通过解决下面的问题来解决)

我的输出数据帧events\u total\u df使用以下格式:

+----------+---------+--------------+
| username |  event  | points_value |
+----------+---------+--------------+
| user1    | event_1 | 100          |
| user2    | event_2 | 120          |
| user2    | event_1 | 100          |
| ...      | ...     | ...          |
+----------+---------+--------------+
+----------+---------+---------+-----+----------+
| username | event_1 | event_2 | ... | event_20 |
+----------+---------+---------+-----+----------+
(我已经用用户名预先填充了events_total_df数据框,并用0填充了每个event列)

我已经有了解决这个问题的办法:

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
这是有道理的。有没有什么方法可以实现我想要的矢量化?我愿意改变任何基本的东西来加快速度。但我不认为这是我如何处理输出数据帧的问题?

试试pivot\u表:

import pandas as pd
result = pd.pivot_table(df, values=['points_value'], index=['user'], columns=['event'], aggfunc={'points_value':'sum'}).reset_index()
这将对每个用户的每个事件的所有点数进行合计。

df.pivot('username'、'event'、'points\u value')