데이터 관리 프로그램 만들기 (4) Pandas Transform 실전 연습

미남로그·2021년 8월 25일
0

데이터

Anaconda의 SF 임금 예제 의 데이터를 활용할 것입니다. 이제 데이터를 불러와야겠죠?

import pandas as pd
import numpy as np

file_path = os.getenv("HOME") + '/aiffel/data_handling/data/Salaries.csv'
sal = pd.read_csv(file_path)

sal.head(5)

저장된 데이터를 불러왔고, 어떤 형태인지 head를 통해 볼게요. (head는 원래 5개만 보여주는데 왜 5를 넣어놨지...)

DataFrame이 커서 한 눈에 안 보여 그냥 컬럼만 출력해보았습니다.

print(sal.columns)

'Id', 'EmployeeName', 'JobTitle', 'BasePay', 'OvertimePay', 'OtherPay', 'Benefits', 'TotalPay', 'TotalPayBenefits', 'Year', 'Notes', 'Agency', 'Status'의 13개 Columns이 있는 걸 확인했고 이를 통해 실습을 진행합니다.

문제

Q1. 평균 basepay는 얼마인가요?
Q2. 최대 OvertimePay는 얼마인가요?
Q3. JOSEPH DRISCOLL의 job title은 무엇인가요?
Q4. JOSEPH DRISCOLL의 급여는 얼마인가요? (benefits 포함해서)
Q5. 월급(Benefit포함) 이 가장 높은 사람은 누구인가요?
Q6. 월급(Benefit포함) 이 가장 낮은 사람은 누구인가요?
Q7. 2011~2014년 동안의 연도별 BasePay의 평균은 각각 얼마인가요?
Q8. Job Title의 종류는 몇 개인가요?
Q9. Job Title중 가장 많은 상위 5개의 Job Title은 무엇인가요?
Q10. Chief 란 단어를 갖는 Job Title은 몇 개인가요? (chief_string()이라는 함수를 만들고 lambda 문법을 사용해 함수를 적용해 보세요)

실습

Q1. 평균 basepay는 얼마인가요?

my code

sal['BasePay'].mean()

출력값: 66327.68895967308

Q2. 최대 OvertimePay는 얼마인가요?

mycode

sal['OvertimePay'].max()

출력값: 245131.88

Q3. JOSEPH DRISCOLL의 job title은 무엇인가요?

mycode

sal[sal['EmployeeName'] == 'JOSEPH DRISCOL']['JobTitle']

출력값:
24 CAPTAIN, FIRE SUPPRESSION
Name: JobTitle, dtype: object

Q4. JOSEPH DRISCOLL의 급여는 얼마인가요? (benefits 포함해서)

mycode

sal[sal['EmployeeName'] == 'JOSEPH DRISCOLL']['TotalPayBenefits']

출력값: 24 270324.91
Name: TotalPayBenefits, dtype: float64

Q5. 월급(Benefit포함) 이 가장 높은 사람은 누구인가요?

mycode

sal[sal['TotalPayBenefits'] == sal['TotalPayBenefits'].max()]['EmployeeName']

출력값:
0 NATHANIEL FORD
Name: EmployeeName, dtype: object

Q6. 월급(Benefit포함) 이 가장 낮은 사람은 누구인가요?

mycode

sal[sal['TotalPayBenefits'] == sal['TotalPayBenefits'].min()]['EmployeeName']

출력값:
110530 David P Kucia
Name: EmployeeName, dtype: object

Q7. 2011~2014년 동안의 연도별 BasePay의 평균은 각각 얼마인가요?

mycode

sal.groupby('Year').mean()['Basepay']

출력값:
Year
2011 63595.956517
2012 65436.406857
2013 69630.030216
2014 66573.154204
Name: BasePay, dtype: float64

Q8. Job Title의 종류는 몇 개인가요?

mycode

sal['JobTitle'].nunique()

출력값: 2158

Q9. Job Title중 가장 많은 상위 5개의 Job Title은 무엇인가요?

mycode

sal['JobTitle'].value_counts()

출력값:
Transit Operator 7036
Special Nurse 4389
Registered Nurse 3736
Public Svc Aide-Public Works 2518
Police Officer 3 2421
...
CRIME LABORATORY MANAGER 1
MEDIA/SECURITY SYSTEMS SUPERVISOR 1
SHELTER OFFICE SUPERVISOR 1
WAREHOUSE WORKER 1
COURT EXECUTIVE OFFICER 1
Name: JobTitle, Length: 2158, dtype: int64

Q10. Chief 란 단어를 갖는 Job Title은 몇 개인가요? (chief_string()이라는 함수를 만들고 lambda 문법을 사용해 함수를 적용해 보세요)

mycode

코드 작성하지 못함.

출력값:

답지

Q1 예시 코드

sal['BasePay'].mean()

Q2 예시 코드

sal['OvertimePay'].max()

Q3 예시 코드

sal[sal['EmployeeName'] == 'JOSEPH DRISCOLL']['JobTitle']

Q4 예시 코드

sal[sal['EmployeeName'] == 'JOSEPH DRISCOLL']['TotalPayBenefits']

Q5 예시 코드

sal[sal['TotalPayBenefits']==sal['TotalPayBenefits'].max()]['EmployeeName']

Q6 예시 코드

sal[sal['TotalPayBenefits']==sal['TotalPayBenefits'].min()]

Q7 예시 코드

sal.groupby('Year').mean()['BasePay']

Q8 예시 코드

sal['JobTitle'].nunique()

Q9 예시 코드

sal['JobTitle'].value_counts().head(5)

Q10 예시 코드

import re
def chief_string(title):
    title_pre = re.sub(r"([?.!,])", r" \\\\1 ", title).lower()
    if 'chief' in title_pre.split():
        return True
    else:
        return False

print(sal['JobTitle'].apply(lambda x : chief_string(x)).sum()) # 627
profile
미남이 귀엽죠

0개의 댓글