본문 바로가기

코딩으로 익히는 Python/Pandas

[Python] 24. pandas DataFrame 데이터 분석 실습 종합 문제 : sort(), pd.cut(),apply(lambda), sr.quantile(), value_counts(), histogram(), pie chart 예제

728x90
반응형
SMALL
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.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

 

과일 데이터

 

fruit=pd.Series( [10,20,30,50],index=['사과','딸기','포도','수박'],name='과일' )
fruit
[OUT] :

사과    10
딸기    20
포도    30
수박    50
dtype: int64

연습문제

 

1. 이름순으로 정렬하시오

 

2. 키보드로 입력 받아 검색된 이름의 점수를 구하시오

 

3. 데이터를 다음과 같이 출력하시오

 

(0~59:F , 60~69:D, 70~79:C, 80~89:B, 90~100:A
---------------------
    이름    국어   학점
---------------------
    홍길동  70     C
    ...
    김철수3 25      F

 

4. 국어 점수 50점 이하는 가산점 20%, 50점 초과는 가산점 10%를 부여하시오

 

5. 국어점수 10%, 50%, 90%에 해당하는 값을 구하시오

 

6. 각 국어점수에 대한 개수를 구하시오

 

7. 국어점수에 대한 boxplot을 그리시오

 

8. 국어점수를 10개(0~100점을) 로 분할한 경우 각 점수별 도수분포표를 구하고(아래이미지참조) 히스토그램을 구하시오

 

9. 과일의 비율을 파이차트로 그리시오


Solution

 

1. 이름순으로 정렬하시오

 

sr.sort_index()
[OUT] :

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

 

2. 키보드로 입력 받아 검색된 이름의 점수를 구하시오

 

search = input('이름을 입력하세요:')
sr[search]
# sr['%s'%search]
[OUT] :

이름을 입력하세요홍길동

90

 

3. 데이터를 다음과 같이 출력하시오

 

(0~59:F , 60~69:D, 70~79:C, 80~89:B, 90~100:A
---------------------
    이름    국어   학점
---------------------
    홍길동  70     C
    ...
    김철수3 25      F

 

print('-'*22)
print('이름','국어', '학점', sep='\t')
print('-'*22)
sr_cut = pd.cut(sr,[-1,59,69,79,89,100],labels=['F','D','C', 'B', 'A'])
sr_cut
[OUT] :

----------------------
이름	국어	학점
----------------------
Out[7]:
홍길동     A
이순신     A
임꺽정     F
정난정     D
이이      C
이황      B
정도전     C
김철수1    B
김철수2    F
김철수3    F
Name: 국어점수, dtype: category
Categories (5, object): [F < D < C < B < A]

 

for n,k,f in zip( sr.index, sr, sr_cut):
    print( n,k,f, sep='\t')
[OUT] :

홍길동	90	A
이순신	90	A
임꺽정	55	F
정난정	60	D
이이	76	C
이황	80	B
정도전	76	C
김철수1	88	B
김철수2	30	F
김철수3	25	F

 

4. 국어 점수 50점 이하는 가산점 20%, 50점 초과는 가산점 10%를 부여하시오

 

sr.apply( lambda v: v*1.2 if v<=50 else v*1.1)
sr[sr<=50] = sr[sr<=50]*1.2
sr[sr>50] = sr[sr>50]*1.1
sr
[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

 

5. 국어점수 10%, 50%, 90%에 해당하는 값을 구하시오

 

sr.quantile([0.1,0.5,0.9])
[OUT] :

0.1    29.5
0.5    76.0
0.9    90.0
Name: 국어점수, dtype: float64

 

6. 각 국어점수에 대한 개수를 구하시오

 

sr.value_counts()
[OUT] :

90    2
76    2
30    1
60    1
25    1
88    1
55    1
80    1
Name: 국어점수, dtype: int64

 

7. 국어점수에 대한 boxplot을 그리시오

 

sr.plot(kind = 'box', ylim=(0,100))
plt.show()

 

8. 국어점수를 10개(0~100점을) 로 분할한 경우 각 점수별 도수분포표를 구하고(아래이미지참조) 히스토그램을 구하시오

 

print('계급','계급값', '도수','누적도수','상대도수', sep='\t')
print('-'*50)
# a = pd.cut(sr,[0,10,20,30,40,50,60,70,80,90,100]).value_counts().sort_index()
result = pd.cut(sr,range(0,101,10)).value_counts().sort_index()
result
[OUT] :

계급	계급값	도수	누적도수	상대도수
--------------------------------------------------
Out[30]:
(0, 10]      0
(10, 20]     0
(20, 30]     2
(30, 40]     0
(40, 50]     0
(50, 60]     2
(60, 70]     0
(70, 80]     3
(80, 90]     3
(90, 100]    0
Name: 국어점수, dtype: int64

 

cv = range( 5,96,5) #계급값

 

#누적도수
srsum = []
defalts = 0
for i in result:
    defalts += i
    srsum.append(defalts)
srsum
[OUT] :

[0, 0, 2, 2, 2, 4, 4, 7, 10, 10]

 

result.cumsum()
[OUT] :

(0, 10]       0
(10, 20]      0
(20, 30]      2
(30, 40]      2
(40, 50]      2
(50, 60]      4
(60, 70]      4
(70, 80]      7
(80, 90]     10
(90, 100]    10
Name: 국어점수, dtype: int64

 

result/result.sum()
[OUT] :

(0, 10]      0.0
(10, 20]     0.0
(20, 30]     0.2
(30, 40]     0.0
(40, 50]     0.0
(50, 60]     0.2
(60, 70]     0.0
(70, 80]     0.3
(80, 90]     0.3
(90, 100]    0.0
Name: 국어점수, dtype: float64

 

a=10
s=f'{a:5}'
print(s)
[OUT] :

10

 

for idx,b,c,d,e in zip(result.index, cv, result, result.cumsum(), result/result.sum() ):
#     print(i,b,c,d,e, sep='\t')
#     print(idx,b,c,d,e, sep='\t')
    print( f'{str(idx):10}{b:5}{c:5}{d:5}{e:5}' )
[OUT] :

(0, 10]       5    0    0  0.0
(10, 20]     10    0    0  0.0
(20, 30]     15    2    2  0.2
(30, 40]     20    0    2  0.0
(40, 50]     25    0    2  0.0
(50, 60]     30    2    4  0.2
(60, 70]     35    0    4  0.0
(70, 80]     40    3    7  0.3
(80, 90]     45    3   10  0.3
(90, 100]    50    0   10  0.0

 

sr.plot(kind='hist', bins=list(range(0,101,10)))
plt.show()

 

9. 과일의 비율을 파이차트로 그리시오

 

fruit.plot(kind = 'pie',autopct='%.2f',
           shadow=True, explode=[0,0,0.1,0.2])
plt.show()


review
- pandas master Yay
728x90
반응형
LIST