我有一个非常大的数据框(3.5+百万个原始数据)。它描述了许多游戏的游戏事件。它有20多个列,但总之,我只需要其中2列:game_id和event。因此,game_id只是一个ID,事件可以像10种不同的类型。我需要为每个游戏计算某种类型的事件。但是对于某些游戏,期望的事件永远不会发生。 例如:
game_id event
0 1 my_event
1 1 my_event
2 1 some_event
3 1 some_event
4 2 some_event
5 2 some_event
6 2 some_event
7 3 my_event
8 3 some_event
在我想要得到之后:
game_id num_of_my_event
0 1 2
1 2 0
2 3 1
因此df[df.event=='my_event'].groupby('game_id').size()
不起作用,因为在某些情况下没有事件。但是,对于所有游戏中存在的事件,它都可以正常运行,而且效果很好。
我已经尝试了下一件事:
event_dic = {i:len(events_df[(events_df.game_id == i) & (events_df.event == 'my_event')])
for i in set(events_df.game_id.values)}
但是它工作太慢了!您能以更优化的方式帮助我吗?
答案 0 :(得分:1)
您可以拆开groupby并使用fill_value放入零。
df.groupby(['game_id','event']).size().unstack(fill_value=0).stack()
输出
game_id event
1 my_event 2
some_event 2
2 my_event 0
some_event 3
3 my_event 1
some_event 1
dtype: int64
如果要获取特定的,请尝试以下操作:
df.groupby(['game_id','event']).size().unstack(fill_value=0)['my_event'].reset_index(name='num_my_event')
输出
game_id num_my_event
0 1 2
1 2 0
2 3 1