我有一个名为df_ratings
的pandas数据框,大约有一百万行和三列。
我想获取此数据框中的数据,对其应用转换,并将其放在名为ratings_matrix
我写了以下代码来实现这个目标:
for i in range(df_ratings.shape[0]): #fill matrix with ratings. zero = unrated
current_user = df_ratings.iloc[i, 0] - 1
current_movie = rated_movies_dictionary[df_ratings.iloc[i, 1]]
current_rating = df_ratings.iloc[i, 2]
ratings_matrix[current_movie, current_user] = current_rating
它有效,但速度很慢。在for循环中迭代数据帧的每一行都很慢。有更快的方法吗?
答案 0 :(得分:3)
cuser = df_ratings.iloc[:, 0].values - 1
cmvie = df_ratings.iloc[:, 1].map(rated_movies_dictionary).values
crate = df_ratings.iloc[:, 2].values
ratings_matrix[cmvie, cuser] = crate
对评论的回应
.values会添加什么吗? - MaartenFabré
是的!在做很多事情时,使用numpy数组往往更有效。由于最终的目标是进行切片分配,我想把所有东西都变成numpy数组。作为一个简单的演示,我在使用pandas系列和该系列中的numpy数组进行切片时运行timeit
。
%timeit np.arange(4)[pd.Series([1, 2, 3])]
%timeit np.arange(4)[pd.Series([1, 2, 3]).values]
111 µs ± 2.25 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
61.1 µs ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)