[Pandas] map, apply, applymap - (2.2.2 version)

map과 apply의 큰 차이.. 바로 map은 시리즈에서만, apply 시리즈와 데이터프레임에 모두 활용해볼 수 있다는 점이었는데..
막상 해보니까 아니 map도 데이터프레임에서 되는디요..? 해서 팀원분과 함께 튜터님을 찾아가 이야기를 나눠본 결과...
Pandas 업그레이드로!! map의 작동 방식이 달라졌다 라는 것을 튜터님과 같이 알아냈다!
이건 다 구글 코랩과 주피터 환경을 비교하여 같이 고민해준 팀원님과 함께 알아봐주신 튜터님께 무한 감사를.. 아니었으면.. 나 내일도 머리 쥐어뜯고 있었을 듯...
*해당 내용은 Pandas 2.2.2 버전에서 실행되는 내용입니다.*
예시로 아무 숫자나 넣어서 우리나라 농구팀의 라운드 별 이긴 횟수의 데이터프레임을 제작해봤다.
import pandas as pd
df = pd.DataFrame({
'정관장' : [4, 6, 5, 3, 2],
'소노' : [5, 4, 3, 2, 2],
'KT' : [3, 4, 4, 6, 7],
'Lg' : [4, 5, 5, 6, 5],
'DB' : [8, 9, 8, 7, 8],
'삼성' : [2, 1, 2, 1, 1],
'가스공사' : [2, 2, 3, 4, 2],
'현대' : [4, 5, 6, 6, 5],
'SK' : [5, 5, 4, 4, 6],
'KCC' : [9, 8, 6, 8, 9]
}, index=['1R','2R','3R','4R','5R'])
df

✳️ map( )
- Series/Dataframe에서 함수를 활용하여 변경 가능
- Series/Dataframe에서 값 mapping 가능
- 행과 열에만 함수를 적용하는 것은 불가능
🔹Series 에서 함수 활용
'정관장' 팀의 이긴 횟수들에만 10을 곱하기
df_multi = df['정관장'].map(lambda x: x * 10)
df_multi

정관장 컬럼에 해당되는 값에만 10을 곱해주는 결과값이 잘 출력 되었다.
🔹Dataframe 에서 함수 활용
전체 데이터 값에 10을 곱하기
df_multi2 = df.map(lambda x: x * 10)
df_multi2

dataframe 전체에도 값이 잘 연산되었다.
🔹value mapping
새로운 데이터프레임을 형성하였다.
df = pd.DataFrame({
'정관장' : ['준형', '성원', '지훈'],
'KT' : ['성곤', '윤기', '정현']
})
df

- Series 적용
mapping = {'준형' : 5, '성원' : 19, '지훈' : 6, '성곤' : 10, '윤기' : 0, '정현' : 12}
df_Smapped = df['정관장'].map(mapping.get)
df_Smapped

mapping이라는 딕셔너리의 값을 .map method를 이용하여 지정한 컬럼의 값을 맵핑 해준 것이다.
- Dataframe 적용
mapping = {'준형' : 5, '성원' : 19, '지훈' : 6, '성곤' : 10, '윤기' : 0, '정현' : 12}
df_mapped = df.map(mapping.get)
df_mapped

mapping이라는 딕셔너리의 값을 .map method를 이용하여 데이터프레임 전체를 맵핑 해준 것이다.
🔹 행/열에 함수 적용 - map은 불가능!
- 행에 함수 적용
df.map(lambda row: row.sum(), axis=1)

- 열에 함수 적용
df.map(lambda col: col.max(), axis=0)

✳️ apply( )
- Series/Dataframe에서 함수를 활용하여 변경 가능
- Series에서만 값 mapping 가능
- 행과 열에만 함수를 적용하는 것 가능
🔹Series 에서 함수 활용
'정관장' 팀의 이긴 횟수들에만 10을 곱하기
df_multi = df['정관장'].apply(lambda x: x * 10)
df_multi

map과 마찬가지로 apply는 동일하게 시리즈에 함수를 활용할 수 있다.
🔹Dataframe 에서 함수 활용
전체 데이터 값에 10을 곱하기
df_mulit2 = df.apply(lambda x: x * 10)
df_mulit2

dataframe에도 작동한다.
🔹value mapping
(map 예시와 동일한 데이터 프레임)
df = pd.DataFrame({
'정관장' : ['준형', '성원', '지훈'],
'KT' : ['성곤', '윤기', '정현']
})
df

- Series 적용
mapping = {'준형' : 5, '성원' : 19, '지훈' : 6, '성곤' : 10, '윤기' : 0, '정현' : 12}
df_Smapped = df['정관장'].apply(mapping.get)
df_Smapped

시리즈에서 apply는 잘 적용되는 걸 확인할 수 있다.
- Dataframe 적용
mapping = {'준형' : 5, '성원' : 19, '지훈' : 6, '성곤' : 10, '윤기' : 0, '정현' : 12}
df_mapped = df.apply(mapping.get)
df_mapped

dataframe에 apply를 써서 값을 맵핑하는 경우 오류가 뜬다.
🔹 행/열에 함수 적용
df = pd.DataFrame({
'A': [5, 6, 10],
'B': [1, 12, 19]
})
df

- 행에 함수 적용
df.apply(lambda row: row.sum(), axis=1)

map에서는 오류가 떴었는데 apply는 각 행별로 더한 값을 출력해준다.
- 열에 함수 적용
df.apply(lambda col: col.max(), axis=0)

각 열 별로 더한 값을 출력해준다.
➕ .applymap()에 대하여...
import pandas as pd
df = pd.DataFrame({
'정관장' : [4, 6, 5, 3, 2],
'소노' : [5, 4, 3, 2, 2],
'KT' : [3, 4, 4, 6, 7],
'Lg' : [4, 5, 5, 6, 5],
'DB' : [8, 9, 8, 7, 8],
'삼성' : [2, 1, 2, 1, 1],
'가스공사' : [2, 2, 3, 4, 2],
'현대' : [4, 5, 6, 6, 5],
'SK' : [5, 5, 4, 4, 6],
'KCC' : [9, 8, 6, 8, 9]
}, index=['1R','2R','3R','4R','5R'])
def mul(x):
return x * 10
df = df.applymap(mul)
df

applymap()은 조만간 사라질 것인가 보당..! map을 대신 쓰라고 한다.