如何加速DataFrame.loc?

时间:2017-09-23 06:00:13

标签: pandas

我有这个代码,我希望以用户给出的评分为中心:

for u in users:
    watched.loc[watched.user_id == u, 'rating'] -= watched.loc[watched.user_id == u, 'rating'].mean()

我有大约2000个用户,总共有200000个评级。上面的代码大约需要20秒。

如果我尝试

watched.set_index('user_id', inplace=True)

然后我有错误

ValueError: Must have equal len keys and value when setting with an iterable

1 个答案:

答案 0 :(得分:1)

循环+过滤是一种非常缓慢的方法;大熊猫中的规范方法是由您想要拆分的变量分组并计算每个组的平均值,然后以单个矢量化方式更新;要保持长度,您可以使用groupby.transformmean计算user_id,然后从rating列中减去:

watched.rating -= watched.rating.groupby(watched.user_id).transform('mean')