2021. 12. 3. 12:22ㆍpython 전문가로/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")
엑셀로 확인해본 결과, 열의 값이 개행처리가 되었다는 것을 확인해볼 수 있습니다.
감사합니다:)