# 참조
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인 사람 찾기
titanic['survived'] == 1

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

마스크를 입힌다는 의미는 긴 코드를 짧은 함수에 묶어 놓는 것을 의미한다.
위에서 데이터프레임 형태로 만들 때 titanic[titanic['survived'] == 1] 이렇식으로 묶어줬는데 너무 길다.
때문에 함수로 한번 묶어주고 이를 mask를 입힌다고 표현한다.
survived_mask = titanic['survived'] == 1 #survived_mask라는 함수로 묶어주기!
titanic[survived_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]

남자들만 필터링 되는것을 볼 수 있다.
위에서는 마스크에 하나의 조건을 가지고 진행해보았다.
이번에는 다중 조건을 가지고 진행해보자.
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가 나온다.
이처럼 비트연산자 &, |, ~ 를 이용하여 다중 조건을 사용할 수 있다.
# 1. 먼저 mask들을 and 연산을 해보자
male_mask & old_mask
# 2. 1의 결과로 출력해보자.
titanic[male_mask & old_mask]

여기서 주의할 점은 다중 조건은 체인형으로 진행하면 안되고 대괄호 안에서 비트연산자로 진행해야 된다.
이게 무슨소리냐? 아래의 예를 보겠다.
titanic[male_mask & old_mask][survived_mask]
이는 체인형으로 survived_mask 를 추가한 것이다.
하지만 이는 경고를 야기한다.

왜 그럴까?
각각의 mask는 데이터 수가 다를 것이다.
하지만 이는 모두 데이터프레임의 형태를 가지고 있기 때문에 **Broadcasting** 이 사용되지 않는다.
그렇기 때문에 아래와 같이 작성하는 것을 지향하자.
titanic[male_mask & old_mask & survived_mask]
rich_mask = titanic['pclass'] == 1
female_mask = titanic['sex'] == 'female'
survived_mask = titanic['survived'] == 1
titanic[rich_mask & female_mask & survived_mask]

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

titanic[kid_mask | female_mask & survived_mask]

오잉!? 생존자가 아닌 사람들도 보인다..
여러 비트연산자가 있는 경우에는 소괄호()를 이용해 우선순위를 지정해 주어야 된다.
titanic[(kid_mask | female_mask) & survived_mask]

굳~