2017-09-26 1 views
2

나는 약 백만 개의 행과 3 개의 열을 가진 df_ratings이라는 팬더 데이터 프레임을 가지고 있습니다.팬더 데이터 프레임을 반복하는 더 빠른 방법을 찾고 있습니다.

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 

그것을 :

나는이 dataframe 내부의 데이터를 가지고 그것에 변환을 적용하고, ratings_matrix

라는 NumPy와 매트릭스 안에 넣어 싶어 나는 이것을 달성하기 위해 다음과 같은 코드를 작성 작동하지만 아주 천천히. 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 ​​뭔가를 추가

가하는 댓글을? - Maarten Fabré

예! 많은 일을 할 때, 종종 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) 
+1

대단히 감사합니다. 훨씬 빨랐습니다. 나는지도에서 더 읽어야한다고 생각합니다. –

+0

대단히 환영합니다. – piRSquared

+0

'.values'는 뭔가 추가합니까? –

관련 문제