📒 Today I Learn/🐍 Python

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

se0ehe 2024. 7. 18. 23:19

 
 
 
 

 
 
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을 대신 쓰라고 한다.