본문 바로가기
Data science

[해결완료] 파이썬 2차원 리스트 1차원으로 오류 concatenate ValueError: zero-dimensional arrays cannot be concatenated

by 리밋T 2022. 9. 28.
반응형

자연어 처리를 하는 과정에서, 특정 단어가 등장했을 때
리스트 형태로 단어가 들어있는 [키워드] 열에 있는 단어라면 [존재하는 키워드], 그렇지 않다면 [새로운 키워드]로 자동 분류하는 코드를 작성하고 있다.

가장 먼저 [키워드] 열에 있는 단어가 파이썬 2차원 리스트이기 때문에
1차원으로 변환하려고 하는데, 이런 오류가 발생했다.

concatenate ValueError: zero-dimensional arrays cannot be concatenated

1. 1차 오류 해결 : 리스트로 바꿔주기

해당 시리즈([키워드] 열)을 먼저 리스트로 변환해줘야 하는데 그 과정을 거치지 않아서 그런 것 같아
먼저 file['키워드'].values.tolist()를 이용해서 리스트로 바꿔준 다음,
np.concatenate를 이용해 1차원으로 변경해보고자 한다.

Pass = np.concatenate(file['키워드'].values.tolist())
print(Pass)

또 오류가 발생했다.

리스트로 바꾼 게 문제였나 싶어 넘파이로만 바꾼 후 수행해보았으나 동일한 오류가 발생했다.

2. 2차 오류 해결 : shape 확인

Pass = file['키워드'].values.shape
print(Pass)

shape를 확인해보니 1차원 넘파이다.

현재 ROW마다 들어있는 데이터의 형태는 ['가','나','다','라']와 같은 형태인데,이걸 어떻게 하나의 리스트로 합쳐줄까?

 

3. 오류 해결 끝!!

조금 비효율적이긴 하지만 단어를 전처리해준 다음, 쉼표 기준으로 다시 split해서 처리해주었다.

전처리는 re.sub과 replace 둘 중 편한 것을 사용해서 특수문자는 모두 삭제하고 ',' 기준으로 split해주면 된다.

약 10,000건의 파일을 처리하는 데 각각 아래와 같은 시간이 소요되었다.

## replace 소요시간 :  0:00:49.665826
## resub 소요시간 :  0:00:46.761486

나는 대상 데이터가 많지 않고 몇 가지 사유로 인해 replace를 사용하였으나,
resub을 사용해도 무방하다. 각자 가진 데이터와 활용방향에 따라서 replace, resub 둘 다 적용해보아도 괜찮을듯.

오늘은 조금 더 속도가 빠른 resub으로 공유해본다.

#판다스 데이터프레임의 열을 하나씩 돌면서 전처리를 하고, 명단을 합쳐주는 코드.
KeywordList=[]
tot_sum=0
for k in tqdm(range(0,len(file['키워드']))):
    tot_sum+=k        
    keywords0 =str(file.loc[k,'키워드'] )
    keywords1 = re.sub("[-=+#/\?:^$.@*\"※~&%ㆍ!\\‘|\(\)\[\]\<\>`\'…\s]","",keywords0).strip() #각종 특수문자를 처리하고 띄어쓰기를 삭제하되 쉼표는 남겨두었다.
    KeywordList.append(keywords1)

마지막으로 ','기준으로 분리한 다음, set으로 중복을 제거하고, sorted로 가나다순 정렬해주었다.

#','기준으로 분리한 다음, 중복을 제거하고, 정렬
KeywordList = sorted(set(str(KeywordList).split(",")))
print(KeywordList)

이제 원하던 결과로 예쁘게 출력되는 것을 확인할 수 있다!

해당 KeywordList에 있는게 맞는지 확인을 원하는 데이터는 val을 이용해서 아래와 같이 할당해줄 수있다.

#예제 코드이므로 변경하여 사용
    for i in range(0,len(new_keywords1)):
        if new.loc[k,'존재하는 키워드']=="":
            val = new_keywords1[i] in KeywordList
            if val :
                new.loc[k,'존재하는 키워드'] = new_keywords1[i]
        else:
            val = new_keywords1[i] in KeywordList
            if val :
                new.loc[k,'존재하는 키워드'] = new(etc.loc[k,'존재하는 키워드'])+','+new_keywords1[i]

new['존재하는 키워드']=new['존재하는 키워드'].str.split(",").values

to_csv로 저장해주고 원하는 결과가 잘 들어있음을 확인했다.

 

반응형

댓글