[python] Pandas를 이용한 데이터 전처리 1

10 minute read

특정 단어가 포함 되었는지 확인하기

1. contains를 이용한 매칭

 1import pandas as pd
 2word = pd.Series(['과일', '사과2개', '사과2개, 배1개', '배1개, 오렌지3개', '배한개, 딸기두개'])
 3word.str.contains('사과', regex=False)
 4---------------------------
 50    False
 61     True
 72     True
 83    False
 94    False
10dtype: bool

두가지 단어 비교

 1import pandas as pd
 2word = pd.Series(['과일', '사과2개', '사과2개, 배1개', '배1개, 오렌지3개', '배한개, 딸기두개'])
 3word.str.contains('사과|배', regex = True)
 4----------------------------
 50    False
 61     True
 72     True
 83     True
 94     True
10dtype: bool

regex = True 로 설정해주어야 한다. False 로 설정할 경우 정규표현식이 작동하지 않아서 False를 반환한다.

 1# regex = False
 2import pandas as pd
 3word = pd.Series(['과일', '사과|배', '사과2개', '사과2개, 배1개', '배1개, 오렌지3개', '배한개, 딸기두개'])
 4word.str.contains('사과|배', regex=False)
 5----------------------------
 60    False
 71     True
 82    False
 93    False
104    False
115    False
12dtype: bool

숫자가 들어간 것 찾기

 1import pandas as pd
 2word = pd.Series(['과일', '사과2개', '사과2개, 배1개', '배1개, 오렌지3개', '배한개, 딸기두개'])
 3word.str.contains('\d', regex=True)
 4----------------------------
 50    False
 61     True
 72     True
 83     True
 94    False
10dtype: bool

2. re.search or re.match 이용

re.search 이용

 1import re
 2
 3compile_val = re.compile(r'라이언|무지|콘')
 4text = ['라이언과 무지는 친구이다.',
 5       '라이언과 콘도 친구이다.',
 6       '프로도와 네오는 연인이다.',
 7       '콘은 크로코다일과 콩알이 조합한 이름이다.',
 8       '무지는 토끼옷 입은 단무지이다.',
 9       '튜브는 소심한 오리이다.',
10       '어피치는 유전자 변형으로 자웅동주가 된 것을 알고 복숭아 나무에서 탈출하였다.']
11
12for i in text:
13    if compile_val.search(i):
14        print(i)
15    else:
16        print('FALSE')
17---------------------------------------
18라이언과 무지는 친구이다.
19라이언과 콘도 친구이다.
20FALSE
21콘은 크로코다일과 콩알이 조합한 이름이다.
22무지는 토끼옷 입은 단무지이다.
23FALSE
24FALSE
  • if문에 직접 정규표현식을 넣으면 매번 새로 compile 되므로 변수에 할당해준 후 for문을 순환하는 것이 속도가 빠르다.

    0.0002초 밖에 안난다고 생각할 수 있지만, 정규식이 복잡해지고, 데이터가 수십만 건으로 늘어나서 for문 순환하게 되면 실행시간의 차이가 크다.

 1# 정규표현식 컴파일을 변수에 할당한 후 for문 실행
 2
 3import time
 4start = time.time()
 5#------------------
 6import re
 7
 8compile_val = re.compile(r'라이언|무지|콘')
 9text = ['라이언과 무지는 친구이다.',
10       '라이언과 콘도 친구이다.',
11       '프로도와 네오는 연인이다.',
12       '콘은 크로코다일과 콩알이 조합한 이름이다.',
13       '무지는 토끼옷 입은 단무지이다.',
14       '튜브는 소심한 오리이다.',
15       '어피치는 유전자 변형으로 자웅동주가 된 것을 알고 복숭아 나무에서 탈출하였다.']
16
17for i in text:
18    if compile_val.search(i):
19        print(i)
20    else:
21        print('FALSE')
22#------------------
23end = time.time()
24elapsed = end - start
25print(elapsed)
26#------------------
270.0005469322204589844
 1# 정규표현식 for문에 넣고 실행
 2
 3import time
 4start = time.time()
 5#------------------
 6import re
 7
 8text = ['라이언과 무지는 친구이다.',
 9       '라이언과 콘도 친구이다.',
10       '프로도와 네오는 연인이다.',
11       '콘은 크로코다일과 콩알이 조합한 이름이다.',
12       '무지는 토끼옷 입은 단무지이다.',
13       '튜브는 소심한 오리이다.',
14       '어피치는 유전자 변형으로 자웅동주가 된 것을 알고 복숭아 나무에서 탈출하였다.']
15
16for i in text:
17    if re.compile(r'라이언|무지|콘').search(i):
18        print(i)
19    else:
20        print('FALSE')
21#------------------
22end = time.time()
23elapsed = end - start
24print(elapsed)
25#------------------
260.0007700920104980469

re.match 이용

re.search 는 포함관계에 있으면 True를 반환한다.

re.match 는 공백 기준으로 완벽하게 일치해야 True를 반환한다.

 1import re
 2
 3compile_val = re.compile(r'라이언|무지|콘')
 4text = ['라이언',
 5        '라이어',
 6        '모지',
 7        '무지는 무지',
 8        '라무지언'
 9       '라이언 무지',
10       '라이언무지',
11       '콘 무지',
12       '라이언무지콘',
13       '라이언콘무지',
14       '라이언 콘 무지',
15       '어피치 프로도',
16       '제이지 라이',
17       '어피치 네오']
18
19for i in text:
20    if compile_val.match(i):
21        print(i)
22    else:
23        print('FALSE')
24----------------------------------
25라이언
26FALSE
27FALSE
28무지는 무지
29FALSE
30라이언무지
31콘 무지
32라이언무지콘
33라이언콘무지
34라이언 콘 무지
35FALSE
36FALSE
37FALSE
  • 라무지언 의 경우 무지, 라이언 과 정확하게 일치 하지 않으므로 FALSE가 반환된다. 앞에서 부터 매칭 시키기 때문에 중간에 무지 가 있어도 FALSE가 반환되는 것이다.