대출 신청자들에 대한 데이터 loan_ex 에는
대출의 승낙 여부 컬럼인 loan_status
소속된 회사에서 근무중인지 자영업인지를 나누는 employed
수입에 대한 컬럼인 income 의 데이터가 포함되어 있습니다.
group 이라는 변수에는 loan_ex 에서
대출이 승낙된 사람들 중에서 자영업자가 아니고,
수입이 중간값 이상인 사람들을 추출하려고 합니다.
group = loan_ex[(loan_ex['loan_status']=='Y') & (~ loan_ex['employed'] == 'N') & (loan_ex['income'] >= loan_ex['income'].median())]
조건식을 넣어주었을때 아래와 같은 에러문구와 함께 에러가 발생되었습니다.
TypeError: bad operand type for unary ~: 'str'
Because not has to create a new value, it returns a boolean value regardless of the type of its argument (for example, not 'foo' produces False rather than ''.)
not은 boolean 으로 True 아니면 False 값을 반환합니다.
not 'foo' 라는 뜻은 " 'foo'가 아닌 문자열 " 과 같이 일치 여부를 반환하는게 아니라, 문자열에서 True와 False 는 비어있는지 문자열 자체로 존재하는지를 판단하므로
" Not ('foo'라고 문자열이 제대로 들어왔는가) " 가 되므로
" Not (True) " 가 되어서 결국 False 값을 반환하게 됩니다.
~(NOT) 연산자와 그 뒤에 괄호로 데이터 boolean 타입을 반환해주도록 넣어주니 True/False가 반환되는 것으로 확인됩니다.
1-1. 그런데 왜...변수에 저장하고 사용하면 괄호 없이도 에러가 안날까...?
이유는 실행 순서 때문
~(loan_ex['employed'] == 'N')
위 코드의 실행 순서는
1번] loan_ex['employed'] == 'N'으로 True/False를 먼저 반환
2번] ~(1번 실행값) 으로 True와 False 반대 값을 반환.
~loan_ex['employed'] == 'N'
위 코드의 실행 순서는
1번] ~loan_ex['employed'] 으로 문자열에 대한 NOT 연산으로 오류 반환 => 종료
group = loan_ex[(loan_ex['loan_status']=='Y') & (~ (loan_ex['employed'] == 'N')) & (loan_ex['income'] >= loan_ex['income'].median())]
에러 해결되는 것을 확인 가능합니다.
이렇게 괄화가 복잡하게 들어가는 것보다
condition1 = loan_ex['loan_status']=='Y'
condition2 = loan_ex['employed'] == 'N'
condition3 = loan_ex['income'] >= loan_ex['income'].median()
group = loan_ex[condition1 & ~condition2 & condition3]
변수에 조건을 담아서 사용하면
괄호로 우선순위를 정해주지 않아도
각각의 변수 먼저 실행되서 더 깔끔하게 보일 수 있을 것 같습니다.