2017-09-26 53 views
2

我有一个名为df_ratings的熊猫数据框,大约有一百万行和三列。寻找更快的方式来迭代熊猫数据帧

我想借此数据这个数据框里面,就可以应用转换,并把它称为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循环中的每一行数据帧都很慢。有没有更快的方法来做到这一点?

+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数组。作为一个简单的演示,我运行timeit,同时使用熊猫系列和该系列中的一个numpy数组进行切片。

%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) 
+1

非常感谢,速度要快得多。我想我应该在地图上阅读更多内容。 –

+0

非常欢迎。 – piRSquared

+0

'.values'添加了什么? –