본문 바로가기
빅데이터분석

[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (10) 조건에 맞는 데이터 필터링(filtering)

by 모닥불🔥 2024. 5. 12.

링고선생님의 파이썬 데이터분석 프로젝트 강의! 강의자료로는 3-5 내용이다. 강의는 홈페이지에서 구매할 수 있음..!

(사진 누르면 링크 이동)


🔥 강의 목차

오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기

🔥 필터링(filtering)

1. 기본 필터링

# 필터링
df[조건]

 

필터링(filtering)은 조건에 부합하는 행(row)만 남기는 것을 의미한다. 조건은 불리안(Boolean)으로 참(True) 또는 거짓(False) 형태가 되어야 한다. 일단 먼저 아래 예제 데이터프레임을 생성하고 직접 실습해보자.

 

예제 데이터는 개인정보 표 같은 건데, 이름 - 나이 - 거주지역(도시) 컬럼으로 구성되어 있다.

import pandas as pd

# 예제 데이터프레임 생성
data = {
    'Name': ['철수', '영희', '흥민', '범근'],
    'Age': [25, 30, 35, 40],
    'City': ['New York', 'Los Angeles', 'New York', 'Chicago']
}

df = pd.DataFrame(data)

 

만약 아래와 같은 조건문을 작성하고 그대로 실행하면 모든 행에 대해 해당 조건이 참인지 거짓인지 Boolean 형태의 결과가 나온다. 0번 인덱스에 해당하는 철수는 나이가 30보다 작으니까 False, 1번 인덱스 영희도 30살보다 어리니까 False, 2번, 3번 인덱스에 해당하는 흥민, 범근은 나이가 서른살보다 많으니까 True!

df['Age'] > 30

 

요 조건문을 condition이라는 변수에 저장하고, 새 컬럼에 저장해주면, 나이가 서른살 이상인지 아닌지 T/F로 표시되는 컬럼이 생성된다.

# condition이라는 변수로 할당, age_over_30이라는 새 컬럼에 값 넣기
condition = df.Age > 30
df['age_over_30'] = condition

 

이 상태에서 이제 진짜 필터링을 해보자. 아까 쓴 조건문을 데이터프레임으로 감싸주기만 하면 필터링이 된다. 값이 True에 해당하는 행 2개만 남은 것을 볼 수 있다. 물론, df[condition] 으로 쓰지 않고, 바로 df[   df['Age'] > 30   ] 이라고 써도 된다. 어쨌든 데이터프레임명[조건] 형태만 되면 실행은 된다.

 

그러나... 조건이란 건 나중에 달라질 수 있는 부분이기 때문에, '변할 수 있는 부분인가?'를 생각하고 변할 수 있는 부분이라면 변수를 사용해주는 게 훨씬 편하다. :D

 

df[condiition]

 

조금 더 복잡한 형태의 필터링을 할 수도 있다.

 

2. Between을 이용한 필터링

# from_n 이상, to_n 이하
df['col'].between(from_n,to_n)

 

df[컬럼].between(a, b) 을 사용하면 A 이상, B 이하 값을 필터링해 준다.

 

먼저, 사용할 데이터는 seaborn 라이브러리의 타이타닉(titanic) 승선자 데이터다. 출력해보면 나이 범위가 다양한 걸 확인할 수 있다.

import seaborn as sns
df= sns.load_dataset('titanic')
df.head()

 

여기에서 20세~22세 사이의 데이터만 필터링 해보자. 대충 눈으로는 20세~22세만 있는 것 같은데...

con = df['age'].between(20, 22)
df[con]

 

value_counts()를 이용해 눈대중보다는 정확하게 확인해야 한다. 20세에서 22세 사이 값만 있는 것을 확인했다.

df[con].age.value_counts()

 

3. isin()을 이용한 필터링

isin은 특정 값을 포함하도록 필터링 하는 방법이다.

# 특정 열(col)의 값이 주어진 목록(['item1', 'item2'])에 포함되어 있는지 여부
df['col'].isin(['item','item'])

 

 

타이타닉 데이터에서 승선한 항구를 뜻하는 'embarked' 컬럼을 출력해보면, 아래와 같이 3종류의 항구가 있다.

 

여기에서 S 항구와 C 항구에서 승선한 사람 데이터(행)만 출력하고 싶다면? 아래와 같이 df['컬럼명'].isin('값')을 적으면 된다. 값이 여러개면 리스트 형태로(대괄호로 감싸기) 넣어주면 된다.

# s, c만 필터링 하고 싶다? isin
con = df['embarked'].isin(['S', 'C'])  # 리스트니까 대괄호로 감싸서 넣기
df[con]

 

다시 value_counts()로 어떤 값이 포함되어 있는지 보면, S, C만 남은 걸 볼 수 있다.

 

4. isna()를 이용한 필터링

isna()는 특정 컬럼의 값이 결측치인지 확인해서, 결측치에 해당할 때 True, 결측치가 아니면 False를 반환한다.

# 특정 열(col)의 값이 결측치(NA)일 경우 True, 아닐 경우 False를 반환
df['col'].isna()

 

타이타닉에서 갑판(deck) 컬럼을 value_counts로 뽑아보자. ** dropna = False를 적어주어야 결측값까지 세어준다. 결측치가 총 688개 있는 것이 보인다. 결측치만 보고 싶은 경우, 혹은 결측치를 빼고 보고싶은 경우 isna()를 활용할 수 있다.

 

먼저, 결측치만 뽑아서 보고싶은 경우 isna() 조건을 df[]으로 감싸주면 된다. 총 688개의 행이 결측치..이고(엄청 많다!), 쭉 오른쪽으로 넘겨서 deck 컬럼을 보면 전부 NaN으로 표시된 것을 볼 수 있다.

condition1 = df['deck'].isna()
df[condition1]

 

 

반대로 결측치를 제외한 값만 보고 싶다면, 물결 표시(~)를 사용해주자. 불리안(boolean) 타입에서 ~를 붙여주면 True는 False로, False는 True로 반전된다.

condition1 = df['deck'].isna()
df[~condition1] # ~조건: True, False 반전

 

데이터를 보면, NaN이 아닌 값은 203개로.. 결측치가 아닌 값이 더 적다. 쭉 넘겨서 deck를 보면 C, E, G... 이런 식으로 모두 채워져 있는 것을 볼 수 있음!

 

여기까지 기본적인 필터링 df[조건], between을 이용한 필터링, isin()과 isna()를 이용한 필터링을 알아보았다.

추가로, 조건문이 들어갈 때에는 한 조건만 들어가는 것이 아니라, 여러 개의 조건을 사용할 수도 있다.

 

5. and(&), or(|) 조건문

두 개 이상의 조건을 결합할 때 사용하는 방법

  • and: 조건들이 모두 True일 때 True를 반환한다.
  • or: 조건들 중 하나라도 True면 True를 반환한다.

 

and와 or은 기호로 대체 가능하다. and는 &, or은 | 기호로 대체할 수 있다.

True & False # and 는 & 기호로 대체 가능
True | False # or은 | 기호로 대체 가능

 

가장 기본적인 형태의 데이터프레임(표 형태)을 만들고, 여러 조건문을 이용해 컬럼을 추가해보자. 아래 코드를 입력하면 num이라는 컬럼에 1부터 9까지 숫자 9개가 각각 담긴 9개의 행이 만들어진다.

impoart pandas as pd

df = pd.DataFrame({'num':[1, 2, 3, 4, 5, 6, 7, 8, 9]})

 

여러 조건문을 써서 컬럼을 추가해보자.

df['col_1'] = df['num'] >= 6 	# 6 이상
df['col_2'] = df['num'] >= 3 	# 3 이상

df['col_and'] = df['col_1'] & df['col_2'] 	# 6 이상이고, 3 이상인 조건을 모두 만족
df['col_or'] = df['col_1'] | df['col_2'] 	# 6 이상 또는 3 이상

df

 

  • 컬럼 1은 6 이상인 데이터만 True로 반환한다. 6, 7, 8, 9가 True로 표시된 것을 볼 수 있다.
  • 컬럼 2는 3 이상인 데이터만 True로 반환한다. 3, 4, ... 8, 9가 True인 것을 볼 수 있다.
  • 컬럼 3은 and 조건을 이용해서, 6 이상이면서 3 이상인 데이터만 True로 반환하도록 했다.
    - 1과 2는 어떠한 조건도 만족하지 못하므로 False
    - 3, 4, 5는 3 이상이라는 조건은 만족하지만, 6 이상이라는 조건을 만족하지 못하므로 and 조건에 어긋나서 Flase
    - 6 이상인 숫자는 모두 3 이상이기도 하므로, 두 조건을 모두 만족하여 True를 반환한다.
    => 즉, 6 이상의 숫자들만 True
  • 컬럼 4는 or 조건을 이용해서, 3 이상이거나 6 이상인 데이터를 True로 반환하게 했다.
    - 1과 2는 어떠한 조건도 만족하지 못하므로 False
    - 3, 4, 5는 3 이상이라는 조건을 만족하므로 True
    - 6 이상의 숫자는 3 이상이라는 조건과 6 이상이라는 조건을 모두 만족하므로 True를 반환한다.
    => 즉, 3 이상의 숫자는 모두 True

이러한 조건문의 특징을 잘 활용하면 원하는 데이터를 필터링 할 수 있을 것 같다. 언제나 도움이 많이 되는 링고 선생님의 강의...!😁👍🏻👍🏻👍🏻

 

 

* 본 게시글은 '메타코드'의 동의를 받아 작성된 글로, 강의 내용에 대한 모든 저작권은 Ringo 선생님에게 있습니다. 개인용도의 학습 외에 무단사용은 엄격히 금지됩니다. 위반 시 법적 조취가 취해질 수 있습니다.