[python] Pandas를 이용한 데이터 전처리 1
특정 단어가 포함 되었는지 확인하기
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가 반환되는 것이다.