[Python pandas] DataFrame의 문자열 칼럼을 분할하여 일부분으로 새로운 칼럼 만들기
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 7. 1. 23:53이번 포스팅에서는 Python pandas 의 DataFrame에서 문자열(string)을 데이터 형태로 가지는 칼럼을 특정 기준(separator, delimiter) 분할(split a string)하여, 그 중의 일부분을 가져다가 DataFrame에 새로운 칼럼으로 만들어서 붙이는 2가지 방법을 소개하겠습니다.
(1) Vectorization을 이용한 pandas DataFrame 문자열 칼럼 분할하기
(2) For Loop operation을 통한 pandas DataFrame 문자열 칼럼 분할하기
(1) Vectorization을 이용한 pandas DataFrame 문자열 칼럼 분할하기 (빠름 ^^)
예제로 사용할 문자열 'id' 와 숫자형 'val' 의 두 개 칼럼으로 이루어진 DataFrame을 만들어보겠습니다. 그리고 문자열 'id' 칼럼을 구분자(separator) '_' 를 기준으로 str.split('_') 메소드를 사용하여 분할(split) 한 후에, 앞부분([0])을 가져다가 'grp'라는 칼럼을 추가하여 만들어보겠습니다.
import numpy as np
import pandas as pd
df = pd.DataFrame({'id': ['A_001', 'A_002', 'A_003', 'B_001', 'C_001', 'C_002'],
'val': np.arange(6)})
print(df)
id val
0 A_001 0
1 A_002 1
2 A_003 2
3 B_001 3
4 C_001 4
5 C_002 5
# 1. vectorization
df['grp'] = df.id.str.split('_').str[0]
print(df)
id val grp
0 A_001 0 A
1 A_002 1 A
2 A_003 2 A
3 B_001 3 B
4 C_001 4 C
5 C_002 5 C
만약 리스트(list)로 만들고 싶으면 분할한 객체에 대해 tolist() 메소드를 사용하면 됩니다.
# tolist()
grp_list = df.id.str.split('_').str[0].tolist()
print(grp_list)
['A', 'A', 'A', 'B', 'C', 'C']
(2) For Loop operation을 통한 pandas DataFrame 문자열 칼럼 분할하기 (느림 -_-;;;)
두번째는 For Loop 연산을 사용하여 한 행, 한 행씩(row by row) 분할하고, 앞 부분 가져다가 'grp' 칼럼에 채워넣고... 를 반복하는 방법입니다. 위의 (1)번의 한꺼번에 처리하는 vectorization 대비 (2)번의 for loop은 시간이 상대적으로 많이 걸립니다. 데이터셋이 작으면 티가 잘 안나는데요, 수백~수천만건이 되는 자료에서 하면 느린 티가 많이 납니다.
# 2. for loop
df = pd.DataFrame({'id': ['A_001', 'A_002', 'A_003', 'B_001', 'C_001', 'C_002'],
'val': np.arange(6)})
for i in range(df.shape[0]):
df.loc[i, 'grp'] = str(df.loc[i, 'id']).split('_')[0]
print(df)
id val grp
0 A_001 0 A
1 A_002 1 A
2 A_003 2 A
3 B_001 3 B
4 C_001 4 C
5 C_002 5 C
많은 도움이 되었기를 바랍니다.