안녕하세요~ 꽁냥이에요!
크기가 큰 데이터에서는 모든 데이터가 필요하지 않고 일부 조건 맞는 데이터를 추출해야 하는데요. 특히 모든 행(레코드라고도 합니다)에서 조건에 맞는 일부 행만 추출하는 경우가 상당히 많은데요.
이번 포스팅에서는 특정 문자와 일치하는 행을 추출하는 방법과 특정 문자를 포함하는 방법에 대해서 소개하려고 합니다.
1. 특정 문자와 일치하는 행 추출하기
먼저 이번 포스팅에서 사용할 데이터를 만들어 줄게요.
import pandas as pd
## 데이터 생성
data = {
'이름' : ['아이린','한예슬','다현','김사랑','강민경'],
'주소' : ['서울 마포구','서울 은평구','서울 노원구','경기도 화성시','경기 용인시'],
'연령대' : ['20','40','20','30','30']
}
df = pd.DataFrame(data)
꽁냥이는 연령대가 20인 행을 추출할 거예요. 특정 문자와 일치하는 행을 추출하는 방법은 2가지가 있는데요.
1. df[ 조건식 ]
2. df.query( 조건식 문자열)
먼저 첫번째 방법을 사용해보겠습니다.
df[df['연령대'] == '20'] ## df[조건식]
첫 번째 방법에서 조건식은 특정 칼럼의 데이터를 가지고 있는 pandas.Series 객체와 특정 문자열을 이용하여 만들어집니다.
위 코드를 실행해보면 아래와 같이 연령대가 20인 행만 추출된 것을 알 수 있습니다.
두 번째 방법을 사용해보겠습니다.
df.query('연령대 == "20"') ## df.query(조건식 문자열)
두 번째 방법에서 조건식은 문자열로 이루어지며 칼럼 이름과 특정 문자열을 이용하여 만들어집니다. 여기서 주의할 점은 조건식 문자열을 홑 따옴표(')로 감쌌다면 특정 문자열은 겹 따옴표(")로 감싸야하며 반대로
조건식 문자열을 겹따옴표(")로 감쌌다면 특정 문자열은 홑 따옴표(')로 감싸야합니다.
위 코드를 실행해보면 첫번째 방법을 사용한 것과 동일한 결과를 얻을 수 있습니다.
2. 특정 문자열을 포함하는 행 추출하기
1. 단어 하나 포함 여부
이번에는 서울에 사는 연예인들을 뽑아보려고 합니다. 특정 문자열을 포함하는 것도 위에서 본 2가지 방법을 이용합니다.
먼저 첫번째 방법을 이용해보겠습니다.
df[df['주소'].str.contains('서울')] ## df[조건식]
'주소' 칼럼에는 문자열 데이터가 들어있으므로 pandas.Series 객체에 내장되어 있는 str.contains 메서드를 이용하여 특정 문자를 포함하는지 여부를 알 수 있습니다.
위 코드를 실행하면 꽁냥이가 원했던 서울에 사는 연예인들만 출력되는 것을 확인할 수 있습니다.
두 번째 방법을 사용해보겠습니다.
df.query('주소.str.contains("서울")') ## df.query(조건식 문자열)
위 코드를 실행하면 첫 번째 방법으로 얻은 결과와 동일한 것을 확인할 수 있습니다.
2. 두 단어 이상 포함 여부
지금까지는 단어 하나의 포함여부를 살펴보았습니다. 이제는 여러 단어의 포함 여부를 살펴보겠습니다. 여러 단어의 경우 OR 연산과 AND 연산을 생각할 수 있어요. OR 연산은 적어도 하나 이상의 단어를 포함하는 모든 행을 추출하고 AND 연산은 주어진 단어를 모두 포함하는 행이 추출됩니다.
- OR 연산 -
주소 칼럼에서 '마포' 또는 '은평'이라는 단어를 포함하는 행을 추출하겠습니다. 아래와 같이 단어 중간에 '|'를 포함시키면 됩니다. 이는 단어가 세개 이상인 경우에도 똑같이 적용됩니다.
df.query('주소.str.contains("마포|은평")', engine='python')
# 또는 df[df['주소'].str.contains('마포|은평|노원')]
- AND 연산 -
OR 연산에서는 '|'라는 특수 문자를 사용하여 비교적 간단하게 구현할 수 있었지만 AND 연산은 이러한 특수 문자가 없습니다. 따라서 아래와 같은 약간의 작업이 필요합니다. 아래 코드는 주소 칼럼에서 '서울'과 '마포'를 모두 포함하는 행만 추출해줍니다. 단어가 세개 이상인 경우 target_string 리스트에 해당 단어를 넣어주시면 됩니다.
target_string = ['서울', '마포']
df[df['주소'].map(lambda x: all(string in x for string in target_string))]
추가)
위 코드를 실행하면 오류가 날 수있는데요. 오류가 나는 경우는 아래와 같이 engine 인자에 'python'을 넣어주세요.
df.query('주소.str.contains("서울")',engine='python')
꽁냥이는 에러가 나지 않아서 아마 Pandas 버전 차이로 인하여 오류가 발생한게 아닌가 싶어요. 참고로 꽁냥이는 Pandas 1.0.4를 쓰고 있어요.
이번 포스팅에서는 특정 문자를 포함하거나 특정 문자와 일치하는 행을 추출하는 방법에 대해서 알아보았습니다. 데이터는 날짜를 통해서도 조회할 수 있는데요. 날짜를 이용한 데이터 조회는 여기를 참고하세요. 궁금한 점, 잘못된 점, 하고 싶은 말은 댓글로 남겨주세요~
지금까지 꽁냥이의 글 읽어주셔서 감사합니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
[Pandas] 8. 랜덤으로 행 추출하기 (2) | 2020.09.12 |
---|---|
[Pandas] 7. 열 추가/삭제하기 (0) | 2020.09.12 |
[Pandas] 5. 데이터프래임(DataFrame) 모든 행, 모든 열 출력하기 (4) | 2020.08.31 |
[Pandas] 4. 필요한 열(Column) 추출하기 (4) | 2020.08.26 |
[Pandas] 3. csv 파일 불러오기/저장하기 (2) | 2020.08.25 |
댓글