Pandas에서 정규 표현식을 사용하여 행 필터링하기
이 글에서는 Pandas에서 정규 표현식을 사용하여 행을 필터링하는 방법에 대해 설명합니다. 데이터 분석에서 특정 패턴에 일치하는 행을 선택하는 것은 중요한 작업이며, 정규 표현식은 이러한 작업을 효율적으로 수행하는 데 강력한 도구입니다.
필수 조건
이 코드를 실행하려면 다음 라이브러리가 설치되어 있어야 합니다.
- pandas: 데이터 분석 및 조작을 위한 라이브러리
- re: 정규 표현식을 처리하는 라이브러리
데이터 준비
먼저, 다음과 같은 데이터가 포함된 'data.csv'라는 CSV 파일을 만들어 보겠습니다.
name,age,city
Kim,30,Seoul
Lee,25,Busan
Park,40,Incheon
Choi,27,Daegu
Jeong,33,Gwangju
코드
import pandas as pd
import re
# 데이터 읽기
data = pd.read_csv('data.csv')
# 이름 열에서 '김'으로 시작하는 행 필터링
filtered_data = data[data['name'].str.match('^김')]
print(filtered_data)
# 도시 열에서 '서울' 또는 '부산'을 포함하는 행 필터링
filtered_data = data[data['city'].str.contains('서울|부산')]
print(filtered_data)
# 나이가 30세 이상인 행 필터링
filtered_data = data[data['age'].str.isdigit() & (data['age'].astype(int) >= 30)]
print(filtered_data)
설명
- pandas.read_csv(): CSV 파일을 읽어 데이터프레임으로 변환합니다.
- str.match(): 정규 표현식과 일치하는지 확인합니다.
^김
: 이름 열에서 '김'으로 시작하는 행을 선택합니다.
- str.contains(): 문자열이 특정 패턴을 포함하는지 확인합니다.
서울|부산
: 도시 열에서 '서울' 또는 '부산'을 포함하는 행을 선택합니다.
- str.isdigit(): 문자열이 숫자로만 구성되어 있는지 확인합니다.
astype(int) >= 30
: 나이 열을 숫자로 변환하고 30 이상인 행을 선택합니다.
주의 사항
- 정규 표현식은 다양한 방식으로 사용될 수 있으므로, 원하는 결과를 얻기 위해 적절한 표현식을 사용하는 것이 중요합니다.
- Pandas에서 정규 표현식을 사용하는 방법에 대한 자세한 내용은 Pandas 공식 문서를 참조하십시오.
예제 코드: Pandas에서 정규 표현식을 사용하여 행 필터링하기
여러 열 조건
다음 코드는 이름 열에서 '김'으로 시작하고 도시 열에서 '서울' 또는 '부산'을 포함하는 행을 필터링합니다.
import pandas as pd
import re
# 데이터 읽기
data = pd.read_csv('data.csv')
# 여러 조건으로 행 필터링
filtered_data = data[(data['name'].str.match('^김')) & (data['city'].str.contains('서울|부산'))]
print(filtered_data)
부정 조건
import pandas as pd
import re
# 데이터 읽기
data = pd.read_csv('data.csv')
# 부정 조건으로 행 필터링
filtered_data = data[~((data['name'].str.match('^김')) | (data['city'].str.contains('서울|부산')))]
print(filtered_data)
명명된 그룹 사용
다음 코드는 'name' 열에서 '김'으로 시작하는 행을 필터링하고, 일치하는 이름 그룹을 'matched_names' 변수에 저장합니다.
import pandas as pd
import re
# 데이터 읽기
data = pd.read_csv('data.csv')
# 명명된 그룹 사용하여 행 필터링
filtered_data = data[data['name'].str.match('^(?P<matched_names>김)')]
print(filtered_data)
print(filtered_data['matched_names'].unique())
Lambda 함수 사용
다음 코드는 'age' 열의 값이 30 이상인 행을 필터링합니다.
import pandas as pd
import re
# 데이터 읽기
data = pd.read_csv('data.csv')
# Lambda 함수 사용하여 행 필터링
filtered_data = data[lambda row: row['age'].isdigit() and int(row['age']) >= 30]
print(filtered_data)
이 예제들은 Pandas에서 정규 표현식을 사용하여 행을 필터링하는 다양한 방법을 보여줍니다. 더 많은 정보와 예제는 Pandas 공식 문서를 참조하십시오.
참고:
- 위 코드는 Python 3.8 이상에서 테스트되었습니다.
- Pandas 및 re 라이브러리가 설치되어 있어야 합니다.
Pandas에서 행 필터링을 위한 정규 표현식 대체 방법
벡터화된 문자열 연산
Pandas는 벡터화된 문자열 연산을 지원하여 열 전체에서 문자열 작업을 효율적으로 수행할 수 있습니다. 다음은 'name' 열에서 '김'으로 시작하는 행을 필터링하는 방법입니다.
import pandas as pd
# 데이터 읽기
data = pd.read_csv('data.csv')
# 벡터화된 문자열 연산 사용하여 행 필터링
filtered_data = data[data['name'].str.startswith('김')]
print(filtered_data)
Boolean 인덱싱
조건에 따라 True 또는 False 값을 반환하는 Boolean Series를 사용하여 행을 필터링할 수 있습니다. 다음은 'age' 열이 30 이상인 행을 필터링하는 방법입니다.
import pandas as pd
# 데이터 읽기
data = pd.read_csv('data.csv')
# Boolean 인덱싱 사용하여 행 필터링
filtered_data = data[data['age'] >= 30]
print(filtered_data)
query() 함수
query()
함수는 SQL 유사 문자열을 사용하여 데이터프레임을 필터링하는 간편한 방법을 제공합니다. 다음은 'name' 열에서 '김'으로 시작하고 'city' 열에서 '서울' 또는 '부산'을 포함하는 행을 필터링하는 방법입니다.
import pandas as pd
# 데이터 읽기
data = pd.read_csv('data.csv')
# query() 함수 사용하여 행 필터링
filtered_data = data.query("name.str.startswith('김') & city.str.contains('서울|부산')")
print(filtered_data)
고유 함수
특정 필터링 작업에 대한 고유 함수를 작성할 수 있습니다. 예를 들어, 'name' 열에 특정 문자열이 포함되는지 확인하는 함수를 만들 수 있습니다.
import pandas as pd
def contains_pattern(name, pattern):
return bool(re.search(pattern, name))
# 데이터 읽기
data = pd.read_csv('data.csv')
# 고유 함수 사용하여 행 필터링
filtered_data = data[data['name'].apply(lambda x: contains_pattern(x, '김'))]
print(filtered_data)
선택 방법
사용할 방법은 특정 요구 사항에 따라 다릅니다. 일반적으로 다음 지침을 따릅니다.
- 데이터 양이 적고 필터링 조건이 단순한 경우: 벡터화된 문자열 연산 또는 Boolean 인덱싱을 사용하는 것이 가장 빠릅니다.
- 데이터 양이 많거나 복잡한 필터링 조건이 있는 경우:
query()
함수 또는 고유 함수를 사용하는 것이 더 읽기 쉽고 유지 관리하기 쉬울 수 있습니다. - 정규 표현식이 필수적인 경우: 정규 표현식을 사용하십시오. 하지만 가능한 경우 위에 설명한 다른 방법 중 하나를 사용하는 것이 더 효율적일 수 있습니다.
python regex pandas