[IAM] 크롤링 데이터 정리
크롤링 소스로 모은 데이터를 정리한다.
크롤링으로 모은 데이터는 원래 이런 모양이었다.
엑셀 자체서 리스트의 [ ] 가 포함된 채로 들어갔다. 해당 값은 특수문자 [ ] 가 포함된 str형태로 들어왔다. 그래서 star열의 경우
1. [ ] 특수문자 제거 >> "5.0, 4.0, 3.0"
2. 리스트화 하기 >>[["5.0, 4.0, 3.0"],["5.0, 5.0, 4.0"], ...... ]
3. 이중리스트 제거 >>["5.0, 4.0, 3.0","5.0, 5.0, 4.0", ...... ]
4. 공백을 기준으로 리스트에 집어 넣는다.
예를들면 3의 list를 star_list라고 한다면 star_list[0] = 5.0, 4.0, 3.0 이 되는데 이때 공백을 기준으로 나누어 빈 star_test3
안에 넣는것이다.
5. "5.0,"의 , 는 공백으로 대체한다.
코드는 아래와 같다.
filename = 'movie.xlsx'
#별점
df = pd.read_excel(filename, usecols = ['star'])
#특수문자 제거
startest = df.apply(lambda x: x.str.strip('[]'), axis = 1)
#리스트화 하기
star_list_from_df = startest.values.tolist()
#이중리스트 벗기기
star_list2 = np.concatenate(star_list_from_df).tolist()
star_test3 = []
#공백을 기준으로 리스트 만들기
for i in range (len(star_list2)) :
test2 = star_list2[i].split()
star_test3 += test2
#이대로 하면 "5.0," 처럼 , 도 포함되므로 ,는 공백으로 대체
for i in range (len(star_test3)) :
star_test3[i] = star_test3[i].replace(",","")
print(len(star_test3))
문제는 review 였다.
star 와 마찬가지로 특수문자가 포함된 str형태로 들어오는데, 이는 공백으로 해결못한다. star는 숫자간 공백이 있어서 가능했지만....review는 내가 하나의 요소로 잡으려는 것에도 공백 포함이 되어 다른 요소로 들어갔다.
예를 들어
['좋아하는 서점입니다!', '애용하는 서점입니다. 오랜만에 갔는데 계산대 알바생분들 불친절하셔서 놀랐네요,,,']
이런 리뷰는
"['좋아하는", "서점입니다!',", " '애용하는", "서점입니다.오랜만에"....이런식으로 나뉘는것이다.
그래서 엄청엄청 고민을 많이 했는데 ......
#리뷰
dff = pd.read_excel(filename, usecols = ['review'])
#리스트화 하기
review_list_from_df = dff.values.tolist()
#이중리스트 벗기기
review_list2 = np.concatenate(review_list_from_df).tolist()
review_test3 = []
for i in range (len(review_list2)) :
rtest2 = eval(review_list2[i])
review_test3 += rtest2
print(len(review_test3))
eval()이라는 아주 편한...함수가 있더라 ㅋㅅㅋ......이거 가지고 이틀 고민했는데 구글링 더 해볼걸그랬다.
그래서 만든 각각의 리스트를 인덱스로 묶는 작업을 했다.
['5.0','4.0','3.0] 과 ['굳','좋아요','그냥그럼'] 을
('5.0','굳'),('4.0','좋아요'),('3.0','그냥그럼') 이렇게 묶고 이를 엑셀파일로 만드는 작업이다.
코드는 아래와 같다.
zip으로 인덱스끼리 묶기
craw_list = list(zip(review_test3,star_test3))
for i in range (len(craw_list)) :
print(craw_list[i])
print(craw_list)
maidf = pd.DataFrame.from_records(craw_list)
maidf.to_excel('test10.xlsx')
zip 함수를 사용했다.
이렇게 각각 만든 파일을 모두 합치고, 별점만 주고 리뷰는 없는 경우를 제거하고, 중복값을 제거하였다.
# 모든 파일 합치기
excel_names = ['test.xlsx', 'test2.xlsx', 'test3.xlsx','test4.xlsx', 'test5.xlsx', 'test6.xlsx','test7.xlsx', 'test8.xlsx', 'test9.xlsx','test10.xlsx']
excels = [pd.ExcelFile(name) for name in excel_names]
frames = [x.parse(x.sheet_names[0], header=None,index_col=None) for x in excels]
frames[1:] = [df[1:] for df in frames[1:]]
combined = pd.concat(frames)
#파일저장
combined.to_excel("C:/Users/user/PycharmProjects/reviewdict/final.xlsx", header=False, index=False)
#null값 제거 한 값
filename = 'final.xlsx'
# nil 제거
df = pd.read_excel(filename)
print(df)
print(df.isnull().sum())
df_nonnil = df.dropna(axis=0)
print(df_nonnil,df_nonnil.isnull().sum())
df_nonnil.to_excel("C:/Users/user/PycharmProjects/reviewdict/final_nonnil.xlsx", header=False, index=False)
# 중복값
filename = 'final_nonnil.xlsx'
# 중복값 측정
df = pd.read_excel(filename)
print(df.duplicated().sum())
그리고 결과물은 아래와 같다. 만개넘게 했는데 뒷작업을 하니 3000개가 빠지고 약 7000개가 남았다.