파이썬 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를 반환했습니다.
댓글