본문 바로가기

코딩으로 익히는 Python/Pandas

[Python] 08. pandas Series Example : apply(lambda),pd.cut().value_counts().sort_index(),items(),unpacking

728x90
반응형
SMALL

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
import matplotlib

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False
sr = pd.Series( [90,90,55,60,76,80,76,88,30,25],
               name="국어점수" )
sr.index=['홍길동','이순신','임꺽정','정난정',
         '이이','이황','정도전','김철수1',
          '김철수2','김철수3']
sr
[OUT] :

홍길동     90
이순신     90
임꺽정     55
정난정     60
이이      76
이황      80
정도전     76
김철수1    88
김철수2    30
김철수3    25
Name: 국어점수, dtype: int64 

문제

 

#1. 국어점수가 가장 큰 값을 구하시오


#2. 국어점수가 가장 큰 값의 이름을 구하시오


#3. 국어점수가 80점 이상인 값을 구하시오


#4. 국어 점수가 50점이상 80점 이하인 값을 구하시오


#5. 이름이 김으로 시작하는 데이터를 구하시오

 

#6. 국어점수의 평균을 구하시오


#7. 국어점수의 총합을 구하시오


#8. 국어점수의 표준편차를 구하시오


#9. 국어점수가 40점 이하인 데이터를 삭제하시오


#10. 국어점수가 50점 이상인 데이터에 가산점 10%를 미만인 경우는 20%를 부여하시오

 

#11. 국어점수 top 5를 구하시오


#12. 국어점수가 50점 이상인 데이터의 바 차트를 그리시오


#13. 국어점수의 범위(0~50,50~70,70~100) 별 도수를 구하시오(범위 : 0~50,50~70,70~100)


#14. 아래처럼 출력하시오(70점이상 합격 미만 불합격)
# ========================
# 이름     국어   합격여부
# =========================
# 홍길동   90      합격
# 이순신   90      합격
# ....

 

※ 스스로 풀어본 후 아래 Solution 확인하기


Solution

#1. 국어점수가 가장 큰 값을 구하시오

sr.max() 
[OUT] :

90

 

#2. 국어점수가 가장 큰 값의 이름을 구하시오

sr.nlargest(1,keep="all").index 
[OUT] :

Index(['홍길동', '이순신'], dtype='object')

 

#3. 국어점수가 80 이상인 값을 구하시오

sr[sr>=80] 
[OUT] :

홍길동     90
이순신     90
이황      80
김철수1    88
Name: 국어점수, dtype: int64

 

#4. 국어 점수가 50점이상 80 이하인 값을 구하시오

sr[(sr>=50)&(sr<=80)]
[OUT] :

임꺽정    55
정난정    60
이이     76
이황     80
정도전    76
Name: 국어점수, dtype: int64 

 

#5. 이름이 김으로 시작하는 데이터를 구하시오

sr[sr.index.str.contains('^김')] 
[OUT] :

김철수1    88
김철수2    30
김철수3    25
Name: 국어점수, dtype: int64

 

#6. 국어점수의 평균을 구하시오

sr.mean()
[OUT] :

67.0 

 

#7. 국어점수의 총합을 구하시오

sr.sum() 
[OUT] :

670

 

#8. 국어점수의 표준편차를 구하시오

sr.std() 
[OUT] :

23.935097428021656 

 

#9. 국어점수가 40 이하인 데이터를 삭제하시오

sr.drop(sr[sr<=40].index) 
[OUT] :

홍길동     90
이순신     90
임꺽정     55
정난정     60
이이      76
이황      80
정도전     76
김철수1    88
Name: 국어점수, dtype: int64 

 

#10. 국어점수가 50 이상인 데이터에 가산점 10% 미만인 경우는 20% 부여하시오

sr.apply(lambda v:v*1.1 if v>=50 else v*1.2)
[OUT] :

홍길동     99.0
이순신     99.0
임꺽정     60.5
정난정     66.0
이이      83.6
이황      88.0
정도전     83.6
김철수1    96.8
김철수2    36.0
김철수3    30.0
Name: 국어점수, dtype: float64 

 

#11. 국어점수 top 5 구하시오

sr.nlargest() 
[OUT] :

홍길동     90
이순신     90
김철수1    88
이황      80
이이      76
Name: 국어점수, dtype: int64 

 

#12. 국어점수가 50 이상인 데이터의 차트를 그리시오

sr50 = sr[sr>=50]
sr50.plot(kind='bar')
plt.show() 

 

#13. 국어점수의 범위(0~50,50~70,70~100) 도수를 구하시오(범위 : 0~50,50~70,70~100)

pd.cut(sr,[0,50,70,100]).value_counts().sort_index() 
[OUT] :

(0, 50]      2
(50, 70]     2
(70, 100]    6
Name: 국어점수, dtype: int64

 

#14. 아래처럼 출력하시오(70점이상 합격 미만 불합격)
# ========================
이름     국어   합격여부
# =========================
홍길동   90      합격
이순신   90      합격
# ....

print('='*25)
print('이름','국어','합격여부',sep='\t')
print('='*25)
for i,v in sr.items():
    if v>=70:
        print(i,v,'합격',sep='\t')
    else:
        print(i,v,'불합격',sep='\t')
# for i,v in zip(sr.items(),sr.apply(lambda v:'합격' if v>=70 else '불합격')):
#     print(i[0],i[1],v,sep='\t') 
[OUT] :

=========================
이름	국어	합격여부
=========================
홍길동	90	합격
이순신	90	합격
임꺽정	55	불합격
정난정	60	불합격
이이	76	합격
이황	80	합격
정도전	76	합격
김철수1	88	합격
김철수2	30	불합격
김철수3	25	불합격 

review
- #14. 처음엔 apply(lambda)만 썼더니 국어컬럼이 생략됨 -> unpacking & zip() 사용
728x90
반응형
LIST