DataFrame 의 데이터들의 변환이 필요할때가 종종 있습니다.
이때 사용할 수 있는 함수는 Map, Apply, ApplyMap 이 있는데요.
각각의 차이점들에 대해서 알아보도록 하겠습니다.
Map, Apply, ApplyMap 은 기본적으로 DataFrame 안에 있는 모든 개별 데이터에 접근하면서 이를 변환합니다.
이들의 차이점은 DataFrame 의 타입이 Series 또는 DataFrame 에 따라 사용할 수 있는 함수가 다릅니다.
Series | DataFrame | |
Map | o | x |
ApplyMap | x | o |
Apply | o | o |
1. map 은 Series 타입에 적용 가능한 반면, applymap 은 DataFrame 타입에 적용 가능하다.
2. apply 는 Series, DataFrame 타입에 모두 문법적으로 허용 가능하며, 1개의 컬럼일때 Map 을 대체하여 사용할 수도 있고, ApplyMap 을 대체하여서 사용 가능합니다.
아래 예제를 통해 확인해보도록 하겠습니다.
1. Map
다음과 같은 날짜 속성을 가진 데이터 프레임이 있다고 가정할때, 연도를 추출하는 예제를 보도록 하겠습니다.
def extract_year(row):
return row.split('-')[0]
date_list = [{'date': '2000-06-27'},
{'date': '2002-09-24'},
{'date': '2005-12-20'}]
df = pd.DataFrame(date_list, columns = ['date'])
Map 함수를 사용하여서 date 컬럼에 함수를 적용하면, 년도를 추출할 수 있습니다.
df['year'] = df['date'].map(extract_year)
Map 함수는 함수 뿐만 아니라, Dictionary 를 넣어서도 변환이 가능합니다.
특히나 범주형 변수를 변환할때 사용할 수 있습니다.
l1 = [{'name': 'Tom', 'sex': "Male"},
{'name': 'Sarah', 'sex': "Female"},
{'name': 'Joy', 'sex': "Male"},
{'name': 'Joy', 'sex': "Unknown"}]
df1 = pd.DataFrame(l1, columns = ['name', 'sex'])
df1.sex = df1.sex.map({"Male": 0, "Female": 1, "Unknown": 2})
2. ApplyMap
하나의 컬럼에 대해서 컬럼값을 변경하고 싶을 때는 Map 을 사용하지만, DataFrame 전체의 데이터를 변경하고 싶을 때는 ApplyMap 을 사용합니다.
아래의 예제에서 예측값과 라벨값의 소수점 아래 3자리까지 표시해보도록 하겠습니다.
data_list = [{'pred': 2.67767, 'label': 3.4367},
{'pred': 2.67767, 'label': 5.44767},
{'pred': 2.67767, 'label': 1.767}]
df = pd.DataFrame(data_list, columns = ['pred', 'label'])
def round_(data):
return np.around(data, decimals=3)
df.applymap(round_)
3. Apply
위의 1, 2 번의 예제에서 map, applymap 에 대체 가능합니다.
df['year'] = df['date'].apply(extract_year)
Apply 함수에서는 Applymap 과 다르게 파라미터를 보내어 출력이 가능합니다.
df.apply(np.around, decimals=3)