개요
DataFrame에서 특정 문자열과 일치하거나 포함하는 데이터를 찾기 위한 방법을 정리한다.
예시 데이터는 다음과 같다.
## importing modules
import numpy as np
import pandas as pd
## creating a pandas DataFrame with strings, NaN, digit
df = pd.DataFrame({
'id': [1, 2, 3, 4, 5, 6, 7]
, 'fruit': ['apple', 'PERSIMON', 'grapes', 'mango', 'peach and perl',
np.NaN,
'1004']
})
문자열 일치
일치 여부는 비교 연산자 ==을 사용하여 확인할 수 있다.
df['fruit'] == 'apple'
# 실행 결과
0 True
1 False
2 False
3 False
4 False
5 False
6 False
Name: fruit, dtype: bool
조건에 맞는 데이터를 인덱싱할 때는 아래와 같이 사용한다.
df[df['fruit'] == 'apple']
# 실행 결과
id fruit
0 1 apple
문자열 포함
pandas.Series 문자열 함수인 str.contains를 사용하여 확인할 수 있다. contains 함수는 문자열 또는 정규식의 일치 여부에 대한 Boolean Series로 반환한다. 첫 번째 매개변수로 찾을 문자열 또는 패턴을 전달하며, 만약 찾을 문자열이 여러 개인 경우에는 |로 구분하여 나열한다.
Series.str.contains(pat, case=True, flags=0, na=None, regex=True)
# 예시
df['fruit'].str.contains('pe')
# 실행 결과
0 False
1 False
2 True
3 False
4 True
5 NaN
6 False
Name: fruit, dtype: object
조건에 맞는 데이터를 인덱싱할 때는 아래와 같이 사용한다. 이 때 포함 여부를 확인한 결괏값에도 NaN이 포함되어 있는데, 이 결측값을 처리하지 않고 인덱싱하는 경우 ValueError: Cannot mask with non-boolean array containing NA / NaN values 에러가 발생한다. 따라서 na를 False로 대체하여 인덱싱에서 제외한다.
df[df['fruit'].str.contains('pe', na=False)]
# 실행 결과
id fruit
2 3 grapes
4 5 peach and perl
대소문자 구분
만약 대소문자를 구분할 필요가 없을 때는 case를 False로 지정한다. 기본값은 대소문자를 구분한다.
df[df['fruit'].str.contains('pe', na=False, case=False)]
# 실행 결과
id fruit
1 2 PERSIMON
2 3 grapes
4 5 peach and perl
문자열 미포함
반대로 문자열을 포함하지 않는 데이터를 찾을 때는 조건절에 ~을 붙여 처리한다.
df[~df['fruit'].str.contains('pe', na=False)]
# 실행 결과
id fruit
0 1 apple
1 2 PERSIMON
3 4 mango
5 6 NaN
6 7 1004
기타 함수
contains와 비슷하지만 다른 함수로 아래와 같은 함수들을 사용할 수 있다.
- Series.str.match : contains는 re.search를, match는 re.match를 사용한다.
- Series.str.startwith : 문자열의 시작이 매개변수로 전달된 패턴과 일치하는지 확인한다.
- Series.str.endwith : 문자열의 끝이 매개변수로 전달된 패턴과 일지하는지 확인한다.
참고 문서
https://biji-jjigae.tistory.com/176
https://rfriend.tistory.com/740
https://ponyozzang.tistory.com/622
https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html