Python DataFrame 문자열 포함 확인 str.contains()

파이썬 DataFrame에 저장한 데이터에 문자열이 검색 문자열이 포함되어 있는지 판단하는 방법을 알아보겠습니다.

pandas.Series 문자열 메서드인 str.contains()를 사용하면 지정한 문자열이 포함되어 있는지 확인할 수 있습니다.

검색 문자열이 포함되어 있는 경우에는 True를 반환합니다.

먼저 샘플 DataFrame 데이터를 준비하겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

print(df)

 

결과

      name  age state  point
0    Alice   24    NY     64
1      Bob   42    CA     24
2  Charlie   18    CA     70
3     Dave   68    TX     70
4    Ellen   24    CA     88
5    Frank   30    NY     57

 

str.contains() 사용 방법

str.contains()를 사용해 DataFrame name 컬럼에 li 문자열을 검색해보겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

print(df['name'].str.contains('li'))

 

결과

0     True
1    False
2     True
3    False
4    False
5    False
Name: name, dtype: bool

 

contains에 지정한 li 문자열이 포함된 행은 True를 반환하고 문자열이 포함되지 않은 행은 False를 반환했습니다.

반환된 결과값은 pandas.Series 형태로 반환되었습니다.

str.contains를 사용할 때 주의점으로는 지정한 문자열이 완전히 일치하는 값이 아닌 부분 일치 하는 값을 찾습니다.

이번에는 name컬럼에 li 문자열이 포함된 행의 값을 전부 표시하는 예제를 보겠습니다.

import pandas as pd

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

df_rs = df[df['name'].str.contains('li')]

print(df_rs)

결과

      name  age state  point
0    Alice   24    NY     64
2  Charlie   18    CA     70

name 컬럼에 li가 포함된 문자열만 DataFrame으로 취득할 수 있습니다.

 

NaN 값이 존재하는 경우

문자열을 검색할 컬럼에 NaN 값이 존재하는 경우에는 Ture 또는 False가 아닌 NaN을 반환합니다.

만약 pandas.Series로 결과를 받아 행을 취득하려고 하면 에러가 발생합니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave',np.nan,'Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# True 또는 False가 아닌 NaN 반환
print(df['name'].str.contains('li'))

# 데이터 취득할 경우 에러 발생
print(df[df['name'].str.contains('li')])

 

결과

# True 또는 False가 아닌 NaN 반환
1    False
2     True
3    False
4      NaN
5    False
Name: name, dtype: object

# 데이터 취득할 경우 에러 발생
ValueError: Cannot mask with non-boolean array containing NA / NaN values

 

NaN이 존재하는 경우에는 na로 NaN 결과를 치환해 주도록 설정해야 합니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave',np.nan,'Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

# NaN이 존재하는 경우 False로 치환
print(df['name'].str.contains('li', na=False))

# NaN이 존재하는 경우 True로 치환
print(df['name'].str.contains('li', na=True))

 

결과

# NaN이 존재하는 경우 False로 치환
0     True
1    False
2     True
3    False
4    False
5    False
Name: name, dtype: bool

# NaN이 존재하는 경우 True로 치환
0     True
1    False
2     True
3    False
4    True
5    False
Name: name, dtype: bool

 

case 대문자 소문자 구분

str.contains() 기본 설정은 대문자와 소문자를 구분하도록 되어있습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

print(df['name'].str.contains('LI'))

 

결과

0    False
1    False
2    False
3    False
4    False
5    False
Name: name, dtype: object

 

대문자와 소문자를 구별하지 않도록 하기 위해서는 case를 False로 설정합니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['Alice','Bob','Charlie','Dave','Ellen','Frank'],
                   'age': [24,42,18,68,24,30],
                   'state': ['NY','CA','CA','TX','CA','NY'],
                   'point': [64,24,70,70,88,57]}
                  )

print(df['name'].str.contains('LI', case=False))

 

결과

0     True
1    False
2     True
3    False
4    False
5    False
Name: name, dtype: object

대소문자 구분 없이 name 컬럼에 LI 문자가 포함되어 있는 경우에는 True를 반환했습니다.

댓글