我有一个数据帧next_train
,其中包含许多玩家的每周数据(在 4 周内观察了 80,000 名玩家,总共观察了 320,000 次(和一个字典players
,其中包含某些玩家的二进制变量(例如 10,000(。我想将此二进制变量添加到数据帧next_train
(如果播放器不在字典中players
,我将变量设置为零(。这就是我的做法:
next_train = pd.read_csv()
# ... calculate dictionary 'players' ...
next_train['variable'] = 0
for player in players:
next_train.loc[next_train['id_of_player'] == player, 'variable'] = players[player]
然而,for
循环需要很长时间才能完成,我不明白为什么。看起来任务是对数据帧中player
的值执行二叉搜索 10,000 次(players
字典的大小(,但执行时间为几分钟。有没有有效的方法来完成这项任务?
你应该使用map
而不是切片,这样会更快:
next_train['variable'] = next_train.id_of_player.map(players)
如果您希望其他行为 0,因此可以使用fillna
:
next_train.variable.fillna(0,inplace = True)
此外,如果您的字典仅包含布尔值,则可能需要重新定义variable
列的类型以占用更少的空间。所以你以这段代码结束:
next_train['variable'] = next_train.id_of_player.map(players).fillna(0).astype(int)
使用map
和fillna
:
next_train['variable'] = next_train['id_of_player'].map(players).fillna(0)
这将通过在玩家 ID 上应用字典来创建一个新列,然后用 0 填充所有空值。