DataFrame 열(Text) 합치기(+개행 추가방법, 주의사항)

2021. 12. 3. 12:22python 전문가로/Python

반응형

안녕하세요! 

오늘은 DataFrame에서 여러개의 열의 값을 하나의 열로 붙이고 싶을때(Text) 어떻게 하는지 간단히 알아보겠습니다. 

저는 위의 evnt_desc_1, evnt_desc_2, evnt_dtail_desc의 열의 값을 하나의 열의 값으로 만들건데요.

여기서 주의사항은 

① 열의 값을 붙일때는 String이여야 한다. 형변환을 꼭 해줄 것!

② 합치는 열의 값이 NaN인 경우, 붙이게된다면 NaN 그대로 붙여지게 되서 fillna()를 꼭 해줘야 한다.

2개 이상의 열의 값을 붙일때에는 붙여지는 열의 값이 모두 없을 경우 개행처리가 2번처리 되기때문에 이부분 또한 if문으로 예외처리를 해줘야 됩니다.

주의사항 ②의 null값의 전처리를 안해준다면 아래와 같이 NaN이 그대로 붙여지게 됩니다.. 

 

따라서, NaN처리를 한 후 컬럼의 값들을 붙여보겠습니다.

2개 이상의 열의 값을 붙일때에는 붙일려는 열의 값이 없을 경우 개행처리가 2번이 되기때문에 이부분 또한 if문으로 예외처리를 해줘야 됩니다. 

post = pd.read_excel('./text.xlsx',engine='openpyxl')
post = post.fillna('')

fillna를 처리한 결과입니다. 

post['evnt_desc_1']= post['evnt_desc_1'].astype('string')
post['evnt_desc_2']= post['evnt_desc_2'].astype('string')
post['evnt_dtail_desc']= post['evnt_dtail_desc'].astype('string')

모두 string으로 형변환을 해주세요.

post['new'] = ''
for i in range(len(post)):
    if(post['evnt_desc_2'][i]==''):
        cols=['evnt_desc_1','evnt_dtail_desc']
        post['new'] = post[cols].apply(lambda row: '\n'.join(row.values.astype(str)), axis=1)
    else: 
        cols=['evnt_desc_1','evnt_desc_2','evnt_dtail_desc']
        post['new'] = post[cols].apply(lambda row: '\n'.join(row.values.astype(str)), axis=1)

3개의 열 중에, 가운데(2번째) 열 값이 없는 경우, 있는경우를 나눠서 apply()함수로 개행처리를 해줍니다. 

그 이유는 앞서서도 적혀있지만, 가운데(2번째)열이 없는 경우에는 개행이 2번처리 될 수 있기 때문입니다. 

새로운 열 post['new']에 각각의 열의 값이 개행처리된 것을 볼 수 있습니다. 

처음에는 text에 \n이 붙여져 있어서 뭐지? 했지만, csv파일로 만들어서 결과를 한번 더 확인해줍니다. 

여기서 한번 더 주의해야할 사항은 to_csv()을 할때 '한글'이 포함되어 있다면 아래와 같이 처리를 해주면 

문제없이 인코딩되서 한글로 결과를 볼 수 있습니다! 

post.to_csv('./test.csv', index = False,  encoding="utf-8-sig")

 

엑셀로 확인해본 결과, 열의 값이 개행처리가 되었다는 것을 확인해볼 수 있습니다. 

 

감사합니다:)