寻找更快的方法来迭代pandas数据帧

时间:2017-09-26 09:28:02

标签: python pandas dataframe

我有一个名为df_ratings的pandas数据框,大约有一百万行和三列。

我想获取此数据框中的数据,对其应用转换,并将其放在名为ratings_matrix

的numpy矩阵中

我写了以下代码来实现这个目标:

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循环中迭代数据帧的每一行都很慢。有更快的方法吗?

1 个答案:

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