Python/NumPy | Pandas

[Python] Pandas - DataFrame 문자열 포함 여부 확인

비번변경 2023. 1. 26. 14:42

개요

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