2017-11-22 1 views
0

저는 기계 학습을 연습하고 영화/등급 데이터 세트로 작업하고 있습니다. 각 장르 (숫자 약 1300 개)를 숫자로 식별하는 데이터 프레임에 새 열을 만들려고합니다. 제 논리는 고유 한 장르와 정수로 된 사전을 만드는 것입니다. 그런 다음 for 루프를 만들어 데이터 프레임의 각 행을 반복하면서 각 장르를 확인한 다음 적절한 값을 "genre_Id"라는 새 열에 할당합니다. 그러나 이것은 내가 ctrl-c로 깰 수없는 무한 루프를 일으켰다. Jupyter에서 작업 할 때와 같은 문제 (인터럽트 커널이 중단하는 데 실패 함). 아래는 나의 접근 방법을 요약 한 것이다.dict에서 pandas DataFrame의 새 열로 숫자 값 추가

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

movies_data = pd.read_csv("C://mypython/moviedata/movies.csv") 
ratings_data = pd.read_csv("C://mypython/moviedata/ratings.csv") 

joined = pd.merge(movies_data,ratings_data, how = 'inner', on=['movieId']) 

print(joined.head()) 
pd.options.display.float_format = '{:,.2f}'.format 

genres = joined['genres'].unique() 


genre_dict = {} 
Id = 1 
for i in genres: 
    genre_dict[i] = Id 
    Id += 1 

joined['genre_id'] = 0  

increment = 0 
for i in joined['genres']: 
    if i in genre_dict: 
     joined['genre_id'][increment] = genre_dict[i] 
     increment += 1 

는 내가 아마 데이터 세트에 대한 20,000,000 행이 같이 작업 할 수있는 작은 샘플을 복용해야한다 알고 있지만 나는이 운동으로 이것을 시도 거라고 생각. "복사 경고에서 설정 값"을 받지만 다른 프로젝트에서는이 문제가 발생하지 않았습니다. 이 작업을 수행하는 방법에 대한 생각은 크게 감사하겠습니다.

편집 시리즈 맵 기능을 사용하여 해결책을 찾았습니다.

내가 방금 언급 할 권한이 없다 [ 'genre_id'] = joined.genres.map (genre_dict)

답변

1

에 합류했다. 이는 데이터 집합에서 범주 형 값을 처리하기위한 제안 및 올바른 절차입니다. 당신은 당신이하고 싶은 일을하는 내장 된 sklearn.preprocessing.OneHotEncoder 함수를 사용할 수 있습니다.
예를 들어 더 잘 이해하려면 One Hot Encode Sequence Data in Python을 확인하십시오. 이게 효과가 있는지 알려주세요.

+0

사실 나는 방금 해결책을 찾았습니다. joined [ 'genre_id'] = joined.genres.map (genre_dict) –

+0

@stephenbarter 사실 저는 ML 알고리즘에 적용 할 범주 값을 만났을 때 이런 식으로 사용했지만 범주 값이 5 개 또는 6 개 이상의 열 사전을 작성하여 사용하는 것은 시간이 많이 소요됩니다. 그 대신에 OneHotEncoder가 최선의 해결책입니다. 알아 낸 것이라면 나는 대답을 지울 것입니다. –

+1

나는 당신이 옳다고 믿습니다. 이 옵션도 잘 작동합니다. 감사합니다 –

관련 문제