pandas의 Map, Apply, ApplyMap
Pandas를 다루다 보면 한번쯤은 헷갈릴만한 map, apply, applymap 정리하기.
#hide
import pandas as pd
Map
Map values of Series according to an input mapping or function. Used for substituting each value in a Series with another value, that may be derived from a function, a dict or a Series. (출처: pandas doc)
Series 대상으로만 사용 가능하며, 주로 series내 값들을 다른 값들로 바꿔주는 데 사용한다.
df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df
name | age | sex | |
---|---|---|---|
0 | James | 32 | male |
1 | Hugh | 18 | male |
2 | Laurie | 27 | female |
# DataFrame에 적용 불가능
try:
df.map({'female': 0, 'male':1})
df
except Exception as e:
print(e)
'DataFrame' object has no attribute 'map'
매핑할 pair들은 dictionary꼴로 넣어주거나 함수, 또는 또다른 series로 넣어줄 수 있다.
# 1. dictionary
df['sex_converted'] = df['sex'].map({'female':0, 'male':1})
df
name | age | sex | sex_converted | |
---|---|---|---|---|
0 | James | 32 | male | 1 |
1 | Hugh | 18 | male | 1 |
2 | Laurie | 27 | female | 0 |
# 2. function
df['sex_converted'] = df['sex'].map(lambda x: 1 if x=='male' else 0)
df
name | age | sex | sex_converted | |
---|---|---|---|---|
0 | James | 32 | male | 1 |
1 | Hugh | 18 | male | 1 |
2 | Laurie | 27 | female | 0 |
# 3. series
mapping_series = pd.Series({'male':1, 'female':0})
df['sex_converted'] = df['sex'].map(mapping_series)
df
name | age | sex | sex_converted | |
---|---|---|---|---|
0 | James | 32 | male | 1 |
1 | Hugh | 18 | male | 1 |
2 | Laurie | 27 | female | 0 |
Apply
series에만 적용가능한 map과 달리, apply는 series/dataframe에 사용가능한 메소드이다.
apply는 map과 달리 지정해 주는 axis에 따라 주어진 함수를 적용한다. (axis=0이면 column, axis=1이면 row 대상) 따라서 map과 달리 apply는 지정된 axis를 따라 function를 적용할 수 있다.
df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df
name | age | sex | |
---|---|---|---|
0 | James | 32 | male |
1 | Hugh | 18 | male |
2 | Laurie | 27 | female |
new_df = df.apply( lambda x: x.sum() if x.dtype == 'int64' else x, axis=0)
new_df
name | age | sex | |
---|---|---|---|
0 | James | 77 | male |
1 | Hugh | 77 | male |
2 | Laurie | 77 | female |
Applymap
Apply a function to a Dataframe elementwise. This method applies a function that accepts and returns a scalar to every element of a DataFrame.
applymap은 dataframe에서만 사용가능한 메소드이다. applymap은 apply와 달리 모든 element에 같은 함수를 적용하기 때문에 axis를 지정할 필요가 없다.
df = pd.DataFrame({'name':['James', 'Hugh', 'Laurie'], 'age':[32, 18, 27], 'sex': ['male', 'male', 'female']})
df
name | age | sex | |
---|---|---|---|
0 | James | 32 | male |
1 | Hugh | 18 | male |
2 | Laurie | 27 | female |
df.applymap(lambda x:len(str(x)))
name | age | sex | |
---|---|---|---|
0 | 5 | 2 | 4 |
1 | 4 | 2 | 4 |
2 | 6 | 2 | 6 |