▼ map과 apply에 대한 개념 정리
https://se0ehe.tistory.com/121
[Pandas] map, apply, applymap - (2.2.2 version)
map과 apply의 큰 차이.. 바로 map은 시리즈에서만, apply 시리즈와 데이터프레임에 모두 활용해볼 수 있다는 점이었는데.. 막상 해보니까 아니 map도 데이터프레임에서 되는디요..? 해서 팀원분과 함
se0ehe.tistory.com
🔒 56번) 데이터를 로드하고 데이터 행과 열의 개수를 출력하라
url = 'https://raw.githubusercontent.com/Datamanim/pandas/main/BankChurnersUp.csv'
🔓 해결 방법
import pandas as pd
url = 'https://raw.githubusercontent.com/Datamanim/pandas/main/BankChurnersUp.csv'
df = pd.read_csv(url)
df
# unnamed : 0 이라는 것은 판다스에서 자체적으로 컬럼이 비었을 경우를 넘버링한 것이다.
# 데이터 저장시, 가장 왼쪽의 인덱스를 날리지 않고 저장하면서 오른쪽 인덱스에 대한 컬럼명이 없어서 생긴 이슈
# 이게 보기 싫을 경우 파일을 불러올 때 index_col을 이용하여 기준을 바꿔준다.
df = pd.read_csv(url, index_col = 0)
df.shape
# (10127, 19)
🔒 57번) Income_Category의 카테고리를 map 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라
Unknown : N
Less than $40K : a
$40K ~ $60K : b
$60K ~ $80K : c
$80K ~ $120K : d
$120K +' : e
🔓 해결 방법
df['Income_Category'].unique()
먼저 해당 컬럼의 고유값을 뽑아보니 다음과 같이 출력이 되었다. 이를 통해 우리가 지정해야 할 범위들이 동일하다는 것을 알 수 있었다.
dic = {
'Unknown' : 'N',
'Less than $40K' : 'a',
'$40K - $60K' : 'b',
'$60K - $80K' : 'c',
'$80K - $120K' : 'd',
'$120K +' : 'e'
}
각각의 쌍을 딕셔너리를 통해 만들었다.
df['Income_Category'].map(dic)
그리고 .map( )을 이용하여 해당 컬럼에 딕셔너리를 묶어줬다.
df.loc[:, 'newIncome'] = df['Income_Category'].map(dic)
df
이제 새로운 컬럼에 새로 정의를 해주고 값을 출력해보면 다음과 같이 새로운 컬럼이 추가된 상태로 데이터프레임이 출력된다.
🔒 58번) Income_Category의 카테고리를 apply 함수를 이용하여 다음과 같이 변경하여 newIncome 컬럼에 매핑하라
Unknown : N
Less than $40K : a
$40K ~ $60K : b
$60K ~ $80K : c
$80K ~ $120K : d
$120K +' : e
🔓 해결 방법
def changeCategory(x):
if x == 'Unknown':
return 'N'
elif x == 'Less than $40K':
return 'a'
elif x == '$40K - $60K':
return 'b'
elif x == '$60K - $80K':
return 'c'
elif x == '$80K - $120K':
return 'd'
elif x == '$120K +' :
return 'e'
새로운 함수로 각 조건에 따른 출력값을 지정하였다.
df['newIncome'] = df['Income_Category'].apply(changeCategory)
새로운 컬럼을 지정하면서 기존 컬럼에 .apply()를 쓰며 앞서 지정한 함수를 넣어 주며 값을 변경해 줬다.
df['newIncome']
df[['newIncome']]
각각 시리즈와 데이터프레임 형태로 출력했다.
🔒 59번) Customer_Age의 값을 이용하여 나이 구간을 AgeState 컬럼으로 정의하라.
0 ~ 9 : 0 ,
10 ~ 19 :10 ,
20 ~ 29 :20 … 각 구간의 빈도수를 출력하라
🔓 해결 방법
df['Customer_Age']
먼저 제시된 컬럼에 대해 정보를 보면 나이가 값으로 들어가 있다.
45세인 사람은 40대에 속해야하는데, 이 값을 10으로 나누고 다시 10을 곱해주면 40이 나온다.
다른 값들도 동일한 연산을 적용해보자.
df['Customer_Age'] // 10 * 10
연산을 수행하면 값들이 연령대를 표현할 수 있게 변했다.
df.loc[:, 'AgeState'] = df['Customer_Age'] // 10 * 10
이제 이 값을 새로운 컬럼에 정의하고,
df['AgeState'].value_counts().sort_index()
valu_counts()로 카운팅을 하고 인덱스로 정렬하면 이렇게 결과가 출력이 된다.
🔒 60번) Education_Level의 값중 Graduate단어가 포함되는 값은 1 그렇지 않은 경우에는 0으로 변경하여 newEduLevel 컬럼을 정의하고 빈도수를 출력하라
🔓 해결 방법
df['Education_Level'].map(lambda x : 1 if 'Graduate' in x else 0)
람다를 이용해서 조건을 줄 수 있는데,
람다식을 보면 x에 값이 들어오는데 이 값이 graduate이면 1을 출력하고 이외에는 0을 출력하라는 것을 나타낸 것이다.
이러한 조건대로 도출되는 결과를 매핑해준다.
df.loc[:, 'newEduLevel'] = df['Education_Level'].map(lambda x : 1 if 'Graduate' in x else 0)
df['newEduLevel'].value_counts()
그리고 새로운 컬럼에 지정하여 카운트를 해보면 graduate인 것의 빈도수가 3644개 인 것을 알 수 있다.
이것은 내가 if문으로 돌려본 것인데 값이 다르게 나와서 .. 스터디때 팀원들과 이야기 해봐야겠다.
🔒 61번) Credit_Limit 컬럼값이 4500 이상인 경우 1 그외의 경우에는 모두 0으로 하는 newLimit 정의하라. newLimit 각 값들의 빈도수를 출력하라
🔓 해결 방법
df['Credit_Limit'].map(lambda x : 1 if x >= 4500 else 0)
df.loc[:, 'newLimit'] = df['Credit_Limit'].map(lambda x : 1 if x >= 4500 else 0)
df['newLimit'].value_counts()
동일하게 람다를 이용하여 조건을 정해주고 매핑한 뒤, 새로운 컬럼을 지정하여 카운트를 통해 빈도수를 출력했다.
🔒 62번) Marital_Status 컬럼값이 Married 이고 Card_Category 컬럼의 값이 Platinum인 경우 1 그외의 경우에는 모두 0으로 하는 newState컬럼을 정의하라. newState의 각 값들의 빈도수를 출력하라
🔓 해결 방법
df['Marital_Status']
df['Card_Category']
먼저 각각의 컬럼에 대해 값을 출력해본 것이다.
def check(x):
if x.Marital_Status == 'Married' and x.Card_Category == 'Platinum':
return 1
else:
return 0
def check(x):
if x['Marital_Status'] == 'Married' and x['Card_Category'] == 'Platinum':
return 1
else:
return 0
위의 코드와 아래의 코드는 함수를 지정해준 것으로 의미는 똑같다! 컬럼을 표기하는 방식만 다르고 함수는 동일하게 흘러간다.
df['newState'] = df.apply(check, axis=1)
df['newState'].value_counts()
지정된 함수를 통해서 .apply( )를 이용했다.
그리고 행에 대해서 적용해줘야 하기 때문에 axis=1을 적용 했다.
결과는 7개로 출력이 되었다.
df[(df.Marital_Status == 'Married') & (df.Card_Category == 'Platinum')]
df[(df.Marital_Status == 'Married') & (df.Card_Category == 'Platinum')].shape
# (7, 23)
실제로 데이터프레임과 쉐잎을 찍어보면 7개임을 확인 할 수 있었다.
🔒 63번) Gender 컬럼값 M인 경우 male, F인 경우 female로 값을 변경하여 Gender 컬럼에 새롭게 정의하라. 각 value의 빈도를 출력하라
🔓 해결 방법
def checkGender(x):
if x == 'M':
return 'male'
else:
return 'female'
df.loc[:, 'Gender'] = df['Gender'].map(checkGender)
조건에 맞는 함수를 지정하고 맵핑을 해줬다.
df.loc[:, 'Gender']
데이터가 잘 변경된 것을 확인할 수 있었고
df.loc[:, 'Gender'].value_counts()
df['Gender'].value_counts()
값을 카운트하여 각각에 대해 빈도수를 출력할 수 있었다.
loc를 넣은 채로 출력하거나 안 넣은 채로 출력해도 결과는 같았다.
'📒 Today I Learn > 🐼 Pandas' 카테고리의 다른 글
[Pandas] 인덱스 & 컬럼 (0) | 2024.07.18 |
---|---|
[Pandas] 데이터 불러오기 / 저장하기 (0) | 2024.07.18 |
[Pandas] Pandas? (0) | 2024.07.17 |
[Pandas] Filtering & Sorting (2) (0) | 2024.07.15 |
[Pandas] Filtering & Sorting (1) (0) | 2024.07.12 |