优化大熊猫数据框中的计数值

时间:2020-05-10 22:24:00

标签: python pandas

我有一个非常大的数据框(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)}

但是它工作太慢了!您能以更优化的方式帮助我吗?

1 个答案:

答案 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