[28일차]DataFrame활용 - 조건문(Conditional Statement) + 퀴즈

김준석·2024년 1월 4일

**Conditional Statement 이란?**

  • 조건문을 영어로 한 것ㅎㅎ
  • 파이썬이라면 True/False를 기반으로 실행제어 if…else..matchcase
  • SQL문이라면 조건에 맞는 데이터를 탐색 where절
  • Pandas에서는 True/False로 만들어진 Series/DataFrame으로 조건에 맞는 데이터를 탐색

실습 환경 구축

# 참조
import pandas as pd

# 데이터프레임 생성
cols = ['name', 'survived', 'pclass', 'fare', 'sex', 'age']
titanic = pd.read_excel('titanic3.xls', usecols=cols)
titanic = titanic[cols]

# 확인
titanic

# name을 index로 지정 후 확인
titanic.set_index('name',inplace=True)


**== 를 이용한 조건문**

  • 살아남은 사람을 찾기 (survived == 1인 사람 찾기)
# 살아남은 survived == 1인 사람 찾기
titanic['survived'] == 1

boolean형으로 나오게 된다.

그렇기 때문에 대괄호로 한번 더 묶어주면 데이터프레임 형태로 바꿀 수 있다.

mask를 입힌다.

마스크를 입힌다는 의미는 긴 코드를 짧은 함수에 묶어 놓는 것을 의미한다.

위에서 데이터프레임 형태로 만들 때 titanic[titanic['survived'] == 1] 이렇식으로 묶어줬는데 너무 길다.

때문에 함수로 한번 묶어주고 이를 mask를 입힌다고 표현한다.

survived_mask = titanic['survived'] == 1 #survived_mask라는 함수로 묶어주기!

titanic[survived_mask] # 이후 함수를 넣어주면 더욱 깔끔하게 코드를 완성할 수 있다.

**같은 방식으로 male_mask, female_mask, old_mask, young_mask 생성**

남자, 여자, 노인, 청년의 데이터를 갖는 마스크를 생성해 보자.

male_mask = titanic['sex'] == 'male'
female_mask = titanic['sex'] == 'female'
old_mask = titanic['age'] > 65
young_mask = titanic['age'] < 15

잘 만들어졌는지 확인해 보자.

# male_mask 확인
titanic[male_mask]

남자들만 필터링 되는것을 볼 수 있다.


**비트연산자(Bitwise operators)를 이용한 다중 조건문(Multiple Conditions)**

위에서는 마스크에 하나의 조건을 가지고 진행해보았다.

이번에는 다중 조건을 가지고 진행해보자.

  • mask1 & mask2형태로 사용
  • & 는 and 연산을 한다
  • | 는 or, ~는 not을 의
# 예제 데이터
x = pd.Series([True, False, True, False])
y = pd.Series([True, True, False, False])

이런 시리즈가 있다고 했을때

& (and) 연산자의 경우 매칭 값이 모두 True일때 True를 반환하고 아니면 False를 반환하는 개념은 모두 알고있을 것이다.

예제 데이터를 x & b 코드로 작성했을 때, 0번 인덱스레이블을 제외하고 모두 False가 나온다.

이처럼 비트연산자 &, |, ~ 를 이용하여 다중 조건을 사용할 수 있다.

남성이고 65세 이상의 사람을 확인해보자.

# 1. 먼저 mask들을 and 연산을 해보자
male_mask & old_mask

# 2. 1의 결과로 출력해보자.
titanic[male_mask & old_mask]

여기서 주의할 점은 다중 조건은 체인형으로 진행하면 안되고 대괄호 안에서 비트연산자로 진행해야 된다.

이게 무슨소리냐? 아래의 예를 보겠다.

예시) **남성이고 65세 이상의 생존 확인**

titanic[male_mask & old_mask][survived_mask]

이는 체인형으로 survived_mask 를 추가한 것이다.

하지만 이는 경고를 야기한다.

왜 그럴까?

각각의 mask는 데이터 수가 다를 것이다.

하지만 이는 모두 데이터프레임의 형태를 가지고 있기 때문에 **Broadcasting** 이 사용되지 않는다.

그렇기 때문에 아래와 같이 작성하는 것을 지향하자.

titanic[male_mask & old_mask & survived_mask]

Quiz. 마스크를 만들고 조회해보자!

**Quiz1. 상류층 여성의 생존 명단 확인**

rich_mask = titanic['pclass'] == 1
female_mask = titanic['sex'] == 'female'
survived_mask = titanic['survived'] == 1

titanic[rich_mask & female_mask & survived_mask]

**Quiz2. 250이상을 지불한 15세 미만 어린이의 생존 명단 확인**

fare_250_mask = titanic['fare'] > 250
kid_mask = titanic['age'] < 15

titanic[fare_250_mask & kid_mask & survived_mask]

**Quiz3. (15세 미만 또는 여성)의 생존 명단 확인**

titanic[kid_mask | female_mask & survived_mask]

오잉!? 생존자가 아닌 사람들도 보인다..

여러 비트연산자가 있는 경우에는 소괄호()를 이용해 우선순위를 지정해 주어야 된다.

titanic[(kid_mask | female_mask) & survived_mask]

굳~

0개의 댓글