我有一个数据框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
字典的大小),但是执行时间是几分钟。有什么有效的方法可以完成这项任务吗?
答案 0 :(得分:1)
您应该使用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)
答案 1 :(得分:1)
使用map
和fillna
:
next_train['variable'] = next_train['id_of_player'].map(players).fillna(0)
这通过在玩家ID上应用字典来创建新列,然后用0填充所有空值。