2017-09-26 127 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'添加了什麼? –