[Python pandas] 데이터프레임에서 두 개의 문자열 변수의 각 원소를 합쳐서 새로운 변수 만들기
Python 분석과 프로그래밍/Python 데이터 전처리 2018. 9. 1. 12:52이번 포스팅에서는 Python pandas의 DataFrame에서 문자열 변수들을 가지고 일부 포맷 변형을 한 후에 새로운 변수를 만드는 방법을 소개하겠습니다. 이게 얼핏 생각하면 쉬울 것 같은데요, 또 한번도 본적이 없으면 어렵습니다. ^^; lambda, apply() 함수와 문자열 처리 메소드 등에 대해서 알고 있으면 이해가 쉽습니다.
(1) 'id' 변수가 전체 5개 자리가 되도록 왼쪽에 비어있는 부분에 '0'을 채워서 새로운 변수 'id_2' 만들기
(Left padding with zeros so that make 5 positions)
(2) 새로 만든 'id_2' 변수와 'name' 변수를 각 원소별로 합쳐서 데이터프레임 안에 새로운 변수 'id_name' 만들기
(element-wise string concatenation with multiple inputs array in pandas DataFrame)
먼저, 예제로 사용할 간단한 DataFrame을 만들어보겠습니다.
In [1]: import pandas as pd In [2]: df = pd.DataFrame({'id': [1, 2, 10, 20, 100, 200], ...: 'name': ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']}) In [3]: df Out[3]: id name 0 1 aaa 1 2 bbb 2 10 ccc 3 20 ddd 4 100 eee 5 200 fff |
(1) 'id' 변수가 전체 5개 자리가 되도록 왼쪽에 비어있는 부분에 '0'을 채워서 새로운 변수 'id_2' 만들기 (Left padding with zeros so that make 5 positions) |
lambda 로 format() 함수를 만들어서 apply() 로 적용을 하여 5자리 중에서 빈 자리를 '0'으로 채웠습니다.
In [4]: df['id_2'] = df['id'].apply(lambda x: "{:0>5d}".format(x)) In [5]: df Out[5]: id name id_2 0 1 aaa 00001 1 2 bbb 00002 2 10 ccc 00010 3 20 ddd 00020 4 100 eee 00100 5 200 fff 00200 |
다양한 숫자 포맷(number format) 함수는 https://mkaz.blog/code/python-string-format-cookbook/ 를 참고하세요.
(2) 새로 만든 'id_2' 변수와 'name' 변수를 각 원소별로 합쳐서 데이터프레임 안에 새로운 변수 'id_name' 만들기 (element-wise string concatenation with multiple inputs array in pandas DataFrame) |
그리고 역시 lambda 로 '_'를 중간 구분자로 해서 두 변수의 문자열을 결합('_'.join)하는 함수를 정의한 후에 apply() 로 적용하였습니다, 'axis = 1'을 설정해준 점 주의하시기 바랍니다.
In [6]: df['id_name'] = df[['id_2', 'name']].apply(lambda x: '_'.join(x), axis=1) In [7]: df Out[7]: id name id_2 id_name 0 1 aaa 00001 00001_aaa 1 2 bbb 00002 00002_bbb 2 10 ccc 00010 00010_ccc 3 20 ddd 00020 00020_ddd 4 100 eee 00100 00100_eee 5 200 fff 00200 00200_fff |
여기서 끝내면 좀 허전하고 아쉬우니 몇 가지 데이터 포맷 변경을 더 해보겠습니다.
(3) 'id' 변수의 값을 소숫점 두번째 자리까지 나타내는 새로운 변수 'id_3' 만들기
(4) 'name' 변수의 문자열을 전부 대문자로 바꾼 새로운 변수 'name_3' 만들기
(5) 데이터프레임 안의 'id_3'와 'name_3' 변수를 합쳐서 새로운 변수 'id_name_3' 만들기
(3) 'id' 변수의 값을 소숫점 두번째 자리까지 나타내는 새로운 변수 'id_3' 만들기 |
"{:.2f}".format() 함수를 사용하여 소숫점 두번째 자리까지 표현하였습니다.
In [8]: df['id_3'] = df['id'].apply(lambda x: "{:.2f}".format(x)) In [9]: df |
(4) 'name' 변수의 문자열을 전부 대문자로 바꾼 새로운 변수 'name_3' 만들기 |
upper() 문자열 내장 메소드를 사용하여 소문자를 대문자로 변경하였습니다.
In [10]: df['name_3'] = df['name'].apply(lambda x: x.upper())
In [11]: df
|
(5) 데이터프레임 안의 'id_3'와 'name_3' 변수를 합쳐서 새로운 변수 'id_name_3' 만들기 |
In [14]: df['id_name_3'] = df[['id_3', 'name_3']].apply(lambda x: ':'.join(x), axis=1)
In [15]: df
|
많은 도움이 되었기를 바랍니다.