apply() 메소드 외에도 map() 메소드로 함수를 적용할 수 있다.
참고로 map() 함수는 파이썬의 map처럼 생각하면 안된다!
딕셔너리 형태로 사용되기 때문에 실습을 통해 더 자세히 알아보자.
people_set = {
'Name' : ['Spencer', 'Mark', 'Tom', 'Peter'],
'Major': ['Computer', 'Science', 'English', 'Computer'],
'YearOfJoining' : [2020, 2019, 2018, 2017],
'DriverLicense' : [True, False, False, True],
'TeacherCertification' : [True, False, False, False],
}
import pandas as pd
people = pd.DataFrame(people_set)
people

DriverLicense 컬럼을 보면 아래와 같다.

이를 map() 메소드를 이용해 값을 변경해보자.
# map() 으로 매핑 확인해서 값 변환
people['DriverLicense'].map({True : 'Yes', False : 'No'})

TeacherCertification 컬럼. 교사 자격이 있는지 없는지 확인하는 컬럼에서 True의 값만 변경해보자.
# 매핑이 안된 값은 그대로? NA? 일까
people['TeacherCertification'].map({True : "yes"})

그럼 False의 값은 결측치로 처리된다.
그렇기 때문에 결측치 발생을 막기 위해서는
map() 함수를 사용하기 전에 value_counts() 로 어떤 값들이 있는지 확인 후 변경을 해줘야 된다.

False 3개
True 1개가 있는 모습
예를 들어 아래와 같이 컬럼 타입을 반환해보자.
먼저 컬럼 타입을 조회!
people.applymap(type)

그럼 데이터 프레임의 형태로 모든 컬럼 타입이 나옴!!
이를 어떤식으로 사용하나?
이전에 컬럼의 타입을 str 로 변경해서 관련 메소드를 사용한 경험을 했었다.
하지만 체인형으로 진행한다면 컬럼 하나 하나 밖에 변경을 못한다.
왜?? 시리즈만 변경 가능하기 때문.
이렇게 이름 컬럼을 str로 변환 후 길이를 재는 코드는 괜찮은데,
people['Name'].str.len()
전체 컬럼을(데이터 프레임) str로 전환할 때 아래와 같은 코드는 안됨.
people.str.len()
즉, 특수한 상황에서 모든 컬럼 타입을 변경할 때 .applymap() 을 사용하면 전체 타입을 변경할 수 있다.
타입을 다 str로 바꿈
people.applymap(str).applymap(type)

먼저 대문자를 만드는 함수를 만들어 준다.
# 대문자 만드는 함수
def uppercase(data):
return data.upper()
이후 .applymap() 을 이용!
people.applymap(str).applymap(uppercase)

사실 형변환 기능은 .astype 으로도 할 수 있다.
모든 요소 형변환 하는 방법은 따로 있긴하다.
위에는 사용자가 함수를 만들어서 모든 요소에 적용할 수 있다는 점을 실습해본 것.
# Lambda도 살펴보자
df = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]})
위와 같은 데이터 프레임이 있다고 할 때
df_squared = df.applymap(lambda x: x**2)
lambda 로 제곱값을 넣어주면
아래와 같이 변경 가능

import pandas as pd
customers = pd.read_csv('marketing_campaign.csv', sep='\t', index_col='ID')
customers
Kidhome 컬럼이 2개 이상이면 다자녀로 표시
0 = 자녀없음
1 = 외동
2 이상 다자녀
.map() 메소드를 이용해보자
customers['Kidhome'].map({0 : '자녀없음', 1 : '외동', 2 : '다자녀'})
이후 해당 컬럼을 추가!
customers['Kidhome'] = customers['Kidhome'].map({0 : '자녀없음', 1 : '외동', 2 : '다자녀'})

customers.astype(str).applymap(uppercase)
위 아래 둘다 같은 값을 가져옴
customers.applymap(str).applymap(uppercase)
