윈도 파일명 규칙¶
파일이름. 확장자
report.xlsx
report.csv >>> 파일 확장명
reprot.ipynb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
pandas.read_excel()
[주요 옵션]
- na_values = '-' : '-' 기호도 NA값으로 인식
- sheet_name = 1 : 2번시트를 불러와라
- skiprows = 3 : 맨 앞의 3개 행 건너뛰고 4번째 행부터 출력
excel 불러오기¶
data1 = pd.read_excel('C:\py_temp\pandas연습.xlsx')
data1
pandas 기능 | Unnamed: 1 | Unnamed: 2 | |
---|---|---|---|
0 | read_excel 연습 | NaN | NaN |
1 | 번호 | 이름 | 별명 |
2 | 1 | 서진수 | 꽃미남 |
3 | 2 | 강감찬 | ?? |
4 | 3 | 어피치 | 꽃미녀 |
data2 = pd.read_excel('C:\py_temp\pandas연습.xlsx', skiprows = 2, na_values = '??')
data2
번호 | 이름 | 별명 | |
---|---|---|---|
0 | 1 | 서진수 | 꽃미남 |
1 | 2 | 강감찬 | NaN |
2 | 3 | 어피치 | 꽃미녀 |
csv 불러오기¶
utf-8, cp949
data3 = pd.read_csv('C:\py_temp\프로야구선수성적_타자_ANSI.csv', encoding = 'cp949')
data3
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
4 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 175 | 23 | 2 | 14 | 90 |
5 | 6 | 최형우 | KIA | 0.342 | 142 | 514 | 98 | 176 | 36 | 3 | 26 | 120 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
8 | 9 | 손아섭 | 롯데 | 0.335 | 144 | 576 | 113 | 193 | 35 | 4 | 20 | 80 |
9 | 10 | 서건창 | 넥센 | 0.332 | 139 | 539 | 87 | 179 | 28 | 3 | 6 | 76 |
10 | 11 | 이명기 | KIA | 0.332 | 115 | 464 | 79 | 154 | 24 | 4 | 9 | 63 |
11 | 12 | 송광민 | 한화 | 0.327 | 117 | 437 | 71 | 143 | 26 | 0 | 13 | 75 |
12 | 13 | 이정후 | 넥센 | 0.324 | 144 | 552 | 111 | 179 | 29 | 8 | 2 | 47 |
13 | 14 | 전준우 | 롯데 | 0.321 | 110 | 455 | 76 | 146 | 27 | 1 | 18 | 69 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
15 | 16 | 버나디나 | KIA | 0.320 | 139 | 557 | 118 | 178 | 26 | 8 | 27 | 111 |
16 | 17 | 최정 | SK | 0.316 | 130 | 430 | 89 | 136 | 18 | 1 | 46 | 113 |
17 | 18 | 안치홍 | KIA | 0.316 | 132 | 487 | 95 | 154 | 29 | 2 | 21 | 93 |
18 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
19 | 20 | 윤석민 | kt | 0.312 | 142 | 538 | 90 | 168 | 30 | 1 | 20 | 105 |
20 | 21 | 모창민 | NC | 0.312 | 136 | 474 | 64 | 148 | 25 | 3 | 17 | 90 |
21 | 22 | 고종욱 | 넥센 | 0.312 | 123 | 426 | 70 | 133 | 24 | 8 | 8 | 54 |
22 | 23 | 구자욱 | 삼성 | 0.310 | 144 | 564 | 108 | 175 | 39 | 10 | 21 | 107 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
25 | 26 | 유한준 | kt | 0.306 | 133 | 445 | 52 | 136 | 19 | 0 | 13 | 68 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
27 | 28 | 강한울 | 삼성 | 0.303 | 135 | 412 | 58 | 125 | 9 | 3 | 0 | 24 |
28 | 29 | 번즈 | 롯데 | 0.303 | 116 | 423 | 71 | 128 | 38 | 0 | 15 | 57 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
DRM(문서보안)이 걸려 있을 경우¶
기업 보안 문제가 있을 경우 xlwings 라이브러리 사용
data3.head()
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
4 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 175 | 23 | 2 | 14 | 90 |
data3.shape # (행 수, 컬럼 수)
(30, 12)
data3.columns
Index(['순위', '선수명', '팀명', '타율', '경기수', '타수', '득점', '안타', '2루타', '3루타', '홈런', '타점'], dtype='object')
data3.info()
# 각 colums의 정보 파악
# null 값 확인 가능
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30 entries, 0 to 29 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 순위 30 non-null int64 1 선수명 30 non-null object 2 팀명 30 non-null object 3 타율 30 non-null float64 4 경기수 30 non-null int64 5 타수 30 non-null int64 6 득점 30 non-null int64 7 안타 30 non-null int64 8 2루타 30 non-null int64 9 3루타 30 non-null int64 10 홈런 30 non-null int64 11 타점 30 non-null int64 dtypes: float64(1), int64(9), object(2) memory usage: 2.9+ KB
data3.describe()
순위 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|
count | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.00000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 |
mean | 15.500000 | 0.324933 | 131.033333 | 483.866667 | 85.70000 | 157.366667 | 28.800000 | 2.600000 | 18.666667 | 84.500000 |
std | 8.803408 | 0.019373 | 11.062466 | 53.011211 | 17.12258 | 20.163954 | 8.142693 | 2.698659 | 11.099342 | 25.597346 |
min | 1.000000 | 0.302000 | 106.000000 | 388.000000 | 52.00000 | 125.000000 | 9.000000 | 0.000000 | 0.000000 | 24.000000 |
25% | 8.250000 | 0.310500 | 123.000000 | 441.250000 | 73.00000 | 137.250000 | 24.250000 | 1.000000 | 12.250000 | 68.250000 |
50% | 15.500000 | 0.320000 | 133.500000 | 479.500000 | 85.50000 | 156.500000 | 28.500000 | 2.000000 | 19.000000 | 84.500000 |
75% | 22.750000 | 0.338000 | 140.500000 | 535.000000 | 97.25000 | 175.750000 | 35.750000 | 3.000000 | 25.500000 | 110.000000 |
max | 30.000000 | 0.370000 | 144.000000 | 576.000000 | 118.00000 | 193.000000 | 42.000000 | 10.000000 | 46.000000 | 124.000000 |
데이터 조회(추출)하기¶
컬럼조회¶
변수명['컬럼이름']
변수명[['컬럼1', '컬럼2']]
data3['선수명'].head(5)
0 김선빈 1 박건우 2 박민우 3 나성범 4 박용택 Name: 선수명, dtype: object
data3[['선수명', '팀명','타율']].head()
선수명 | 팀명 | 타율 | |
---|---|---|---|
0 | 김선빈 | KIA | 0.370 |
1 | 박건우 | 두산 | 0.366 |
2 | 박민우 | NC | 0.363 |
3 | 나성범 | NC | 0.347 |
4 | 박용택 | LG | 0.344 |
^ (시작 지정자)
$ (끝 지정자)
정규표현식¶
data3.filter(regex='타').head()
data3.filter(regex='^타').head()
타율 | 타수 | 타점 | |
---|---|---|---|
0 | 0.370 | 476 | 64 |
1 | 0.366 | 483 | 78 |
2 | 0.363 | 388 | 47 |
3 | 0.347 | 498 | 99 |
4 | 0.344 | 509 | 90 |
data3.filter(regex='타$').head()
안타 | 2루타 | 3루타 | |
---|---|---|---|
0 | 176 | 34 | 1 |
1 | 177 | 40 | 2 |
2 | 141 | 25 | 4 |
3 | 173 | 42 | 2 |
4 | 175 | 23 | 2 |
data3.filter(regex='타$|^타').head()
타율 | 타수 | 안타 | 2루타 | 3루타 | 타점 | |
---|---|---|---|---|---|---|
0 | 0.370 | 476 | 176 | 34 | 1 | 64 |
1 | 0.366 | 483 | 177 | 40 | 2 | 78 |
2 | 0.363 | 388 | 141 | 25 | 4 | 47 |
3 | 0.347 | 498 | 173 | 42 | 2 | 99 |
4 | 0.344 | 509 | 175 | 23 | 2 | 90 |
# 컬럼 번호를 이용한 연속적인 컬럼 이름 지정
data3[data3.columns[1:4]].head()
선수명 | 팀명 | 타율 | |
---|---|---|---|
0 | 김선빈 | KIA | 0.370 |
1 | 박건우 | 두산 | 0.366 |
2 | 박민우 | NC | 0.363 |
3 | 나성범 | NC | 0.347 |
4 | 박용택 | LG | 0.344 |
# difference: 특정 컬럼 값 제외
data3[data3.columns.difference(['안타', '2루타'], sort = False)].head()
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 4 | 3 | 47 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 2 | 24 | 99 |
4 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 2 | 14 | 90 |
data3[data3.columns.difference(['안타', '2루타'])].head()
3루타 | 경기수 | 득점 | 선수명 | 순위 | 타수 | 타율 | 타점 | 팀명 | 홈런 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 137 | 84 | 김선빈 | 1 | 476 | 0.370 | 64 | KIA | 5 |
1 | 2 | 131 | 91 | 박건우 | 2 | 483 | 0.366 | 78 | 두산 | 20 |
2 | 4 | 106 | 84 | 박민우 | 3 | 388 | 0.363 | 47 | NC | 3 |
3 | 2 | 125 | 103 | 나성범 | 4 | 498 | 0.347 | 99 | NC | 24 |
4 | 2 | 138 | 83 | 박용택 | 5 | 509 | 0.344 | 90 | LG | 14 |
filter_columns = [col for col in data3.columns if '타' not in col]
data4 = data3[filter_columns]
data4
순위 | 선수명 | 팀명 | 경기수 | 득점 | 홈런 | |
---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 137 | 84 | 5 |
1 | 2 | 박건우 | 두산 | 131 | 91 | 20 |
2 | 3 | 박민우 | NC | 106 | 84 | 3 |
3 | 4 | 나성범 | NC | 125 | 103 | 24 |
4 | 5 | 박용택 | LG | 138 | 83 | 14 |
5 | 6 | 최형우 | KIA | 142 | 98 | 26 |
6 | 7 | 김재환 | 두산 | 144 | 110 | 35 |
7 | 8 | 로사리오 | 한화 | 119 | 100 | 37 |
8 | 9 | 손아섭 | 롯데 | 144 | 113 | 20 |
9 | 10 | 서건창 | 넥센 | 139 | 87 | 6 |
10 | 11 | 이명기 | KIA | 115 | 79 | 9 |
11 | 12 | 송광민 | 한화 | 117 | 71 | 13 |
12 | 13 | 이정후 | 넥센 | 144 | 111 | 2 |
13 | 14 | 전준우 | 롯데 | 110 | 76 | 18 |
14 | 15 | 이대호 | 롯데 | 142 | 73 | 34 |
15 | 16 | 버나디나 | KIA | 139 | 118 | 27 |
16 | 17 | 최정 | SK | 130 | 89 | 46 |
17 | 18 | 안치홍 | KIA | 132 | 95 | 21 |
18 | 19 | 러프 | 삼성 | 134 | 90 | 31 |
19 | 20 | 윤석민 | kt | 142 | 90 | 20 |
20 | 21 | 모창민 | NC | 136 | 64 | 17 |
21 | 22 | 고종욱 | 넥센 | 123 | 70 | 8 |
22 | 23 | 구자욱 | 삼성 | 144 | 108 | 21 |
23 | 24 | 김주찬 | KIA | 122 | 78 | 12 |
24 | 25 | 오재일 | 두산 | 128 | 62 | 26 |
25 | 26 | 유한준 | kt | 133 | 52 | 13 |
26 | 27 | 민병헌 | 두산 | 123 | 73 | 14 |
27 | 28 | 강한울 | 삼성 | 135 | 58 | 0 |
28 | 29 | 번즈 | 롯데 | 116 | 71 | 15 |
29 | 30 | 김하성 | 넥센 | 141 | 90 | 23 |
Quiz¶
# 2-1.
df = pd.read_excel('C:\py_temp\부품구입대장_2.xlsx', skiprows = 3)
df[['사업장', '품목', '수량', '금액']].head(6)
사업장 | 품목 | 수량 | 금액 | |
---|---|---|---|---|
0 | 석수 | ANGLE | 21 | 672000 |
1 | 석수 | 백관 | 44 | 2464000 |
2 | 석수 | 절연판 | 40 | 1800000 |
3 | 석수 | P/Z O-RING | 11 | 418000 |
4 | 석수 | 알코올 | 38 | 304000 |
5 | 석수 | 실리콘 | 30 | 4500000 |
# 2-1.
df = pd.read_csv('C:\py_temp\농구선수_전체.csv', encoding = 'cp949')
df[['선수이름', '포지션', '리바운드성공횟수']].head(5)
선수이름 | 포지션 | 리바운드성공횟수 | |
---|---|---|---|
0 | 단군할아버지 | 슈팅가드 | 2.6 |
1 | 동명왕 | 슈팅가드 | 2.8 |
2 | 온조왕 | 슈팅가드 | 1.5 |
3 | 박혁거세 | 슈팅가드 | 2.8 |
4 | 광개토대왕 | 센터 | 6.5 |
# 2-2
wc = pd.read_csv('C:\py_temp\위스콘신_유방암_진단데이터.csv', encoding = 'utf-8')
wc.filter(regex = '평균$')
반지름_평균 | 텍스처_평균 | 둘레길이_평균 | 면적_평균 | 평활도_평균 | 콤팩트도_평균 | 오목면_평균 | 오목점_평균 | 대칭성_평균 | 프랙탈도_평균 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 17.99 | 10.38 | 122.80 | 1001.0 | 0.11840 | 0.27760 | 0.30010 | 0.14710 | 0.2419 | 0.07871 |
1 | 20.57 | 17.77 | 132.90 | 1326.0 | 0.08474 | 0.07864 | 0.08690 | 0.07017 | 0.1812 | 0.05667 |
2 | 19.69 | 21.25 | 130.00 | 1203.0 | 0.10960 | 0.15990 | 0.19740 | 0.12790 | 0.2069 | 0.05999 |
3 | 11.42 | 20.38 | 77.58 | 386.1 | 0.14250 | 0.28390 | 0.24140 | 0.10520 | 0.2597 | 0.09744 |
4 | 20.29 | 14.34 | 135.10 | 1297.0 | 0.10030 | 0.13280 | 0.19800 | 0.10430 | 0.1809 | 0.05883 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
564 | 21.56 | 22.39 | 142.00 | 1479.0 | 0.11100 | 0.11590 | 0.24390 | 0.13890 | 0.1726 | 0.05623 |
565 | 20.13 | 28.25 | 131.20 | 1261.0 | 0.09780 | 0.10340 | 0.14400 | 0.09791 | 0.1752 | 0.05533 |
566 | 16.60 | 28.08 | 108.30 | 858.1 | 0.08455 | 0.10230 | 0.09251 | 0.05302 | 0.1590 | 0.05648 |
567 | 20.60 | 29.33 | 140.10 | 1265.0 | 0.11780 | 0.27700 | 0.35140 | 0.15200 | 0.2397 | 0.07016 |
568 | 7.76 | 24.54 | 47.92 | 181.0 | 0.05263 | 0.04362 | 0.00000 | 0.00000 | 0.1587 | 0.05884 |
569 rows × 10 columns
# 2-2
wc[wc.columns.difference(['target'])]
대칭성_최대 | 대칭성_평균 | 대칭성_표준편차 | 둘레길이_최대 | 둘레길이_평균 | 둘레길이_표준편차 | 면적_최대 | 면적_평균 | 면적_표준편차 | 반지름_최대 | ... | 콤팩트도_표준편차 | 텍스처_최대 | 텍스처_평균 | 텍스처_표준편차 | 평활도_최대 | 평활도_평균 | 평활도_표준편차 | 프랙탈도_최대 | 프랙탈도_평균 | 프랙탈도_표준편차 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.4601 | 0.2419 | 0.03003 | 184.60 | 122.80 | 8.589 | 2019.0 | 1001.0 | 153.40 | 25.380 | ... | 0.04904 | 17.33 | 10.38 | 0.9053 | 0.16220 | 0.11840 | 0.006399 | 0.11890 | 0.07871 | 0.006193 |
1 | 0.2750 | 0.1812 | 0.01389 | 158.80 | 132.90 | 3.398 | 1956.0 | 1326.0 | 74.08 | 24.990 | ... | 0.01308 | 23.41 | 17.77 | 0.7339 | 0.12380 | 0.08474 | 0.005225 | 0.08902 | 0.05667 | 0.003532 |
2 | 0.3613 | 0.2069 | 0.02250 | 152.50 | 130.00 | 4.585 | 1709.0 | 1203.0 | 94.03 | 23.570 | ... | 0.04006 | 25.53 | 21.25 | 0.7869 | 0.14440 | 0.10960 | 0.006150 | 0.08758 | 0.05999 | 0.004571 |
3 | 0.6638 | 0.2597 | 0.05963 | 98.87 | 77.58 | 3.445 | 567.7 | 386.1 | 27.23 | 14.910 | ... | 0.07458 | 26.50 | 20.38 | 1.1560 | 0.20980 | 0.14250 | 0.009110 | 0.17300 | 0.09744 | 0.009208 |
4 | 0.2364 | 0.1809 | 0.01756 | 152.20 | 135.10 | 5.438 | 1575.0 | 1297.0 | 94.44 | 22.540 | ... | 0.02461 | 16.67 | 14.34 | 0.7813 | 0.13740 | 0.10030 | 0.011490 | 0.07678 | 0.05883 | 0.005115 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
564 | 0.2060 | 0.1726 | 0.01114 | 166.10 | 142.00 | 7.673 | 2027.0 | 1479.0 | 158.70 | 25.450 | ... | 0.02891 | 26.40 | 22.39 | 1.2560 | 0.14100 | 0.11100 | 0.010300 | 0.07115 | 0.05623 | 0.004239 |
565 | 0.2572 | 0.1752 | 0.01898 | 155.00 | 131.20 | 5.203 | 1731.0 | 1261.0 | 99.04 | 23.690 | ... | 0.02423 | 38.25 | 28.25 | 2.4630 | 0.11660 | 0.09780 | 0.005769 | 0.06637 | 0.05533 | 0.002498 |
566 | 0.2218 | 0.1590 | 0.01318 | 126.70 | 108.30 | 3.425 | 1124.0 | 858.1 | 48.55 | 18.980 | ... | 0.03731 | 34.12 | 28.08 | 1.0750 | 0.11390 | 0.08455 | 0.005903 | 0.07820 | 0.05648 | 0.003892 |
567 | 0.4087 | 0.2397 | 0.02324 | 184.60 | 140.10 | 5.772 | 1821.0 | 1265.0 | 86.22 | 25.740 | ... | 0.06158 | 39.42 | 29.33 | 1.5950 | 0.16500 | 0.11780 | 0.006522 | 0.12400 | 0.07016 | 0.006185 |
568 | 0.2871 | 0.1587 | 0.02676 | 59.16 | 47.92 | 2.548 | 268.6 | 181.0 | 19.15 | 9.456 | ... | 0.00466 | 30.37 | 24.54 | 1.4280 | 0.08996 | 0.05263 | 0.007189 | 0.07039 | 0.05884 | 0.002783 |
569 rows × 30 columns
행 조회하기 - loc[], iloc[]
- 변수명.loc[인덱스번호, 컬럼이름]
- 변수명.iloc[행 번호, 컬럼 번호]
- 변수명.iloc[행번호][컬럼이름]
data3.loc[2]
순위 3 선수명 박민우 팀명 NC 타율 0.363 경기수 106 타수 388 득점 84 안타 141 2루타 25 3루타 4 홈런 3 타점 47 Name: 2, dtype: object
data3.iloc[2]
순위 3 선수명 박민우 팀명 NC 타율 0.363 경기수 106 타수 388 득점 84 안타 141 2루타 25 3루타 4 홈런 3 타점 47 Name: 2, dtype: object
data3.loc[0:3] # 0,1,2,3 출력
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
data3.iloc[0:3]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
data3.loc[[0,3]]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
data3.iloc[[0,3]]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
data3.loc[:3]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
data3.loc[25:]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
25 | 26 | 유한준 | kt | 0.306 | 133 | 445 | 52 | 136 | 19 | 0 | 13 | 68 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
27 | 28 | 강한울 | 삼성 | 0.303 | 135 | 412 | 58 | 125 | 9 | 3 | 0 | 24 |
28 | 29 | 번즈 | 롯데 | 0.303 | 116 | 423 | 71 | 128 | 38 | 0 | 15 | 57 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
loc[[인덱스번호, 인덱스번호], ['컬럼이름', '컬럼이름']]¶
data3.loc[4, '선수명']
'박용택'
data3.loc[[4,5,6], ['선수명', '팀명', '홈런']]
선수명 | 팀명 | 홈런 | |
---|---|---|---|
4 | 박용택 | LG | 14 |
5 | 최형우 | KIA | 26 |
6 | 김재환 | 두산 | 35 |
data3.loc[25: , '선수명']
25 유한준 26 민병헌 27 강한울 28 번즈 29 김하성 Name: 선수명, dtype: object
loc[인덱스:인덱스, ' 컬럼이름1':'컬럼이름2']¶
data3.loc[25: , '선수명': '타수']
선수명 | 팀명 | 타율 | 경기수 | 타수 | |
---|---|---|---|---|---|
25 | 유한준 | kt | 0.306 | 133 | 445 |
26 | 민병헌 | 두산 | 0.304 | 123 | 447 |
27 | 강한울 | 삼성 | 0.303 | 135 | 412 |
28 | 번즈 | 롯데 | 0.303 | 116 | 423 |
29 | 김하성 | 넥센 | 0.302 | 141 | 526 |
연속적인 컬럼 + 개별 컬럼 함께 조회하기 (join 사용)¶
data3.loc[25: , '선수명': '타수'].join(data3['안타'])
선수명 | 팀명 | 타율 | 경기수 | 타수 | 안타 | |
---|---|---|---|---|---|---|
25 | 유한준 | kt | 0.306 | 133 | 445 | 136 |
26 | 민병헌 | 두산 | 0.304 | 123 | 447 | 136 |
27 | 강한울 | 삼성 | 0.303 | 135 | 412 | 125 |
28 | 번즈 | 롯데 | 0.303 | 116 | 423 | 128 |
29 | 김하성 | 넥센 | 0.302 | 141 | 526 | 159 |
조건 조회
1. str 사용
contain : 특정 문자 포함하는 ~ <br>
'|' 기호 사용해서 여러 조건 한번에 조회 가능 <br>
startwith: 특정 글자로 시작하는 ~ <br>
endwith: 특정 글자로 끝나는 ~ <br>
~: 특정 문자 제외
2. isin: 정확하게 매칭되는 문자
3. 숫자 조건
기호 사용: >=, <, > 등 <br>
검색 조건이 2개 이상일 경우 괄호 사용해서 우선순위 지정 <br>
between(a,b, inclusive = left, right, both, neither) <br>
data4 = data3[data3['팀명'].str.contains('두산')]
data4
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
data4_2 = data3[data3['팀명'].str.contains('두산|한화')]
data4_2
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
11 | 12 | 송광민 | 한화 | 0.327 | 117 | 437 | 71 | 143 | 26 | 0 | 13 | 75 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
data4_3 = data3[data3['선수명'].str.startswith('김')]
data4_3
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
data4_4 = data3[data3['선수명'].str.startswith('김', '박')]
data4_4
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
data4_5 = data3[data3['선수명'].str.endswith('우')]
data4_5
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
5 | 6 | 최형우 | KIA | 0.342 | 142 | 514 | 98 | 176 | 36 | 3 | 26 | 120 |
13 | 14 | 전준우 | 롯데 | 0.321 | 110 | 455 | 76 | 146 | 27 | 1 | 18 | 69 |
data4_6 = data3[data3['팀명'].isin(['두산'])]
data4_6
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
data4_7 = data3[~data3['선수명'].str.contains('우')]
data4_7
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
4 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 175 | 23 | 2 | 14 | 90 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
8 | 9 | 손아섭 | 롯데 | 0.335 | 144 | 576 | 113 | 193 | 35 | 4 | 20 | 80 |
9 | 10 | 서건창 | 넥센 | 0.332 | 139 | 539 | 87 | 179 | 28 | 3 | 6 | 76 |
10 | 11 | 이명기 | KIA | 0.332 | 115 | 464 | 79 | 154 | 24 | 4 | 9 | 63 |
11 | 12 | 송광민 | 한화 | 0.327 | 117 | 437 | 71 | 143 | 26 | 0 | 13 | 75 |
12 | 13 | 이정후 | 넥센 | 0.324 | 144 | 552 | 111 | 179 | 29 | 8 | 2 | 47 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
15 | 16 | 버나디나 | KIA | 0.320 | 139 | 557 | 118 | 178 | 26 | 8 | 27 | 111 |
16 | 17 | 최정 | SK | 0.316 | 130 | 430 | 89 | 136 | 18 | 1 | 46 | 113 |
17 | 18 | 안치홍 | KIA | 0.316 | 132 | 487 | 95 | 154 | 29 | 2 | 21 | 93 |
18 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
19 | 20 | 윤석민 | kt | 0.312 | 142 | 538 | 90 | 168 | 30 | 1 | 20 | 105 |
20 | 21 | 모창민 | NC | 0.312 | 136 | 474 | 64 | 148 | 25 | 3 | 17 | 90 |
21 | 22 | 고종욱 | 넥센 | 0.312 | 123 | 426 | 70 | 133 | 24 | 8 | 8 | 54 |
22 | 23 | 구자욱 | 삼성 | 0.310 | 144 | 564 | 108 | 175 | 39 | 10 | 21 | 107 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
25 | 26 | 유한준 | kt | 0.306 | 133 | 445 | 52 | 136 | 19 | 0 | 13 | 68 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
27 | 28 | 강한울 | 삼성 | 0.303 | 135 | 412 | 58 | 125 | 9 | 3 | 0 | 24 |
28 | 29 | 번즈 | 롯데 | 0.303 | 116 | 423 | 71 | 128 | 38 | 0 | 15 | 57 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
data3[data3['홈런'] >= 30]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
16 | 17 | 최정 | SK | 0.316 | 130 | 430 | 89 | 136 | 18 | 1 | 46 | 113 |
18 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
data3.loc[data3['홈런'] >= 30, ['순위','선수명', '홈런']]
순위 | 선수명 | 홈런 | |
---|---|---|---|
6 | 7 | 김재환 | 35 |
7 | 8 | 로사리오 | 37 |
14 | 15 | 이대호 | 34 |
16 | 17 | 최정 | 46 |
18 | 19 | 러프 | 31 |
data3.loc[(data3['홈런'] >= 30) & (data3['선수명'].str.contains('김')), ['순위','선수명', '홈런']]
순위 | 선수명 | 홈런 | |
---|---|---|---|
6 | 7 | 김재환 | 35 |
data3.loc[(data3['홈런'] >= 30 & data3['선수명'].str.contains('김')), ['순위','선수명', '홈런']]
순위 | 선수명 | 홈런 | |
---|---|---|---|
0 | 1 | 김선빈 | 5 |
1 | 2 | 박건우 | 20 |
2 | 3 | 박민우 | 3 |
3 | 4 | 나성범 | 24 |
4 | 5 | 박용택 | 14 |
5 | 6 | 최형우 | 26 |
6 | 7 | 김재환 | 35 |
7 | 8 | 로사리오 | 37 |
8 | 9 | 손아섭 | 20 |
9 | 10 | 서건창 | 6 |
10 | 11 | 이명기 | 9 |
11 | 12 | 송광민 | 13 |
12 | 13 | 이정후 | 2 |
13 | 14 | 전준우 | 18 |
14 | 15 | 이대호 | 34 |
15 | 16 | 버나디나 | 27 |
16 | 17 | 최정 | 46 |
17 | 18 | 안치홍 | 21 |
18 | 19 | 러프 | 31 |
19 | 20 | 윤석민 | 20 |
20 | 21 | 모창민 | 17 |
21 | 22 | 고종욱 | 8 |
22 | 23 | 구자욱 | 21 |
23 | 24 | 김주찬 | 12 |
24 | 25 | 오재일 | 26 |
25 | 26 | 유한준 | 13 |
26 | 27 | 민병헌 | 14 |
27 | 28 | 강한울 | 0 |
28 | 29 | 번즈 | 15 |
29 | 30 | 김하성 | 23 |
data3[data3['홈런'].between(30, 40, inclusive = 'right')]
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
18 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
Quiz¶
data8 = data3[data3['선수명'].str.contains('김') & data3['홈런'].between(20,50, inclusive = 'left')]
data8
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
data9 = data3[(data3['선수명'].str.contains('김')) & (data3['홈런'] >= 20) & (data3['홈런'] < 50)]
data9
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
data10 = pd.read_excel('C:\py_temp\프로야구선수성적_타자.xlsx')
data10.loc[(data10['선수명'].str.contains('김')) & (data10['홈런'] >= 20), ['선수명', '팀명', '홈런']]
선수명 | 팀명 | 홈런 | |
---|---|---|---|
6 | 김재환 | 두산 | 35 |
29 | 김하성 | 넥센 | 23 |
1일차 정리¶
numpy, pandas 구분 기준
데이터 불러오기 / 옵션 xlsx: pd.read_excel()
csv: pd.read_csv()데이터 탐색 - EDA, head(), tail(), info(), shape, columns
데이터 조회(추출) 컬럼이름 1개
컬럼이름 2개 이상
정규식 : filter(regex='^, $')
행 조회 :loc <br> iloc <br>
조건 조회 :
str.contains(): 일부만 매칭 <br> isin(): 완전히 일치 <br> 숫자: >=, between(30, 40, inclusive='left')
데이터 정렬하기¶
ascending: 오름차순 (True, False)
reset_index(drop=True)
nlargest(건수,'컬럼명'): 큰 값부터 출력(내림차순) - 숫자/날자 컬럼만 가능
nsmalest
data3.sort_values(['경기수','타수'], ascending = False)
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
8 | 9 | 손아섭 | 롯데 | 0.335 | 144 | 576 | 113 | 193 | 35 | 4 | 20 | 80 |
22 | 23 | 구자욱 | 삼성 | 0.310 | 144 | 564 | 108 | 175 | 39 | 10 | 21 | 107 |
12 | 13 | 이정후 | 넥센 | 0.324 | 144 | 552 | 111 | 179 | 29 | 8 | 2 | 47 |
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
19 | 20 | 윤석민 | kt | 0.312 | 142 | 538 | 90 | 168 | 30 | 1 | 20 | 105 |
5 | 6 | 최형우 | KIA | 0.342 | 142 | 514 | 98 | 176 | 36 | 3 | 26 | 120 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
15 | 16 | 버나디나 | KIA | 0.320 | 139 | 557 | 118 | 178 | 26 | 8 | 27 | 111 |
9 | 10 | 서건창 | 넥센 | 0.332 | 139 | 539 | 87 | 179 | 28 | 3 | 6 | 76 |
4 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 175 | 23 | 2 | 14 | 90 |
0 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
20 | 21 | 모창민 | NC | 0.312 | 136 | 474 | 64 | 148 | 25 | 3 | 17 | 90 |
27 | 28 | 강한울 | 삼성 | 0.303 | 135 | 412 | 58 | 125 | 9 | 3 | 0 | 24 |
18 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
25 | 26 | 유한준 | kt | 0.306 | 133 | 445 | 52 | 136 | 19 | 0 | 13 | 68 |
17 | 18 | 안치홍 | KIA | 0.316 | 132 | 487 | 95 | 154 | 29 | 2 | 21 | 93 |
1 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
16 | 17 | 최정 | SK | 0.316 | 130 | 430 | 89 | 136 | 18 | 1 | 46 | 113 |
24 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
3 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
26 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
21 | 22 | 고종욱 | 넥센 | 0.312 | 123 | 426 | 70 | 133 | 24 | 8 | 8 | 54 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
7 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
11 | 12 | 송광민 | 한화 | 0.327 | 117 | 437 | 71 | 143 | 26 | 0 | 13 | 75 |
28 | 29 | 번즈 | 롯데 | 0.303 | 116 | 423 | 71 | 128 | 38 | 0 | 15 | 57 |
10 | 11 | 이명기 | KIA | 0.332 | 115 | 464 | 79 | 154 | 24 | 4 | 9 | 63 |
13 | 14 | 전준우 | 롯데 | 0.321 | 110 | 455 | 76 | 146 | 27 | 1 | 18 | 69 |
2 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
data3.sort_values(['경기수','타수'], ascending = False).reset_index(drop=True)
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 9 | 손아섭 | 롯데 | 0.335 | 144 | 576 | 113 | 193 | 35 | 4 | 20 | 80 |
1 | 23 | 구자욱 | 삼성 | 0.310 | 144 | 564 | 108 | 175 | 39 | 10 | 21 | 107 |
2 | 13 | 이정후 | 넥센 | 0.324 | 144 | 552 | 111 | 179 | 29 | 8 | 2 | 47 |
3 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
4 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
5 | 20 | 윤석민 | kt | 0.312 | 142 | 538 | 90 | 168 | 30 | 1 | 20 | 105 |
6 | 6 | 최형우 | KIA | 0.342 | 142 | 514 | 98 | 176 | 36 | 3 | 26 | 120 |
7 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
8 | 16 | 버나디나 | KIA | 0.320 | 139 | 557 | 118 | 178 | 26 | 8 | 27 | 111 |
9 | 10 | 서건창 | 넥센 | 0.332 | 139 | 539 | 87 | 179 | 28 | 3 | 6 | 76 |
10 | 5 | 박용택 | LG | 0.344 | 138 | 509 | 83 | 175 | 23 | 2 | 14 | 90 |
11 | 1 | 김선빈 | KIA | 0.370 | 137 | 476 | 84 | 176 | 34 | 1 | 5 | 64 |
12 | 21 | 모창민 | NC | 0.312 | 136 | 474 | 64 | 148 | 25 | 3 | 17 | 90 |
13 | 28 | 강한울 | 삼성 | 0.303 | 135 | 412 | 58 | 125 | 9 | 3 | 0 | 24 |
14 | 19 | 러프 | 삼성 | 0.315 | 134 | 515 | 90 | 162 | 38 | 0 | 31 | 124 |
15 | 26 | 유한준 | kt | 0.306 | 133 | 445 | 52 | 136 | 19 | 0 | 13 | 68 |
16 | 18 | 안치홍 | KIA | 0.316 | 132 | 487 | 95 | 154 | 29 | 2 | 21 | 93 |
17 | 2 | 박건우 | 두산 | 0.366 | 131 | 483 | 91 | 177 | 40 | 2 | 20 | 78 |
18 | 17 | 최정 | SK | 0.316 | 130 | 430 | 89 | 136 | 18 | 1 | 46 | 113 |
19 | 25 | 오재일 | 두산 | 0.306 | 128 | 412 | 62 | 126 | 27 | 0 | 26 | 89 |
20 | 4 | 나성범 | NC | 0.347 | 125 | 498 | 103 | 173 | 42 | 2 | 24 | 99 |
21 | 27 | 민병헌 | 두산 | 0.304 | 123 | 447 | 73 | 136 | 21 | 0 | 14 | 71 |
22 | 22 | 고종욱 | 넥센 | 0.312 | 123 | 426 | 70 | 133 | 24 | 8 | 8 | 54 |
23 | 24 | 김주찬 | KIA | 0.309 | 122 | 440 | 78 | 136 | 39 | 2 | 12 | 70 |
24 | 8 | 로사리오 | 한화 | 0.339 | 119 | 445 | 100 | 151 | 30 | 1 | 37 | 111 |
25 | 12 | 송광민 | 한화 | 0.327 | 117 | 437 | 71 | 143 | 26 | 0 | 13 | 75 |
26 | 29 | 번즈 | 롯데 | 0.303 | 116 | 423 | 71 | 128 | 38 | 0 | 15 | 57 |
27 | 11 | 이명기 | KIA | 0.332 | 115 | 464 | 79 | 154 | 24 | 4 | 9 | 63 |
28 | 14 | 전준우 | 롯데 | 0.321 | 110 | 455 | 76 | 146 | 27 | 1 | 18 | 69 |
29 | 3 | 박민우 | NC | 0.363 | 106 | 388 | 84 | 141 | 25 | 4 | 3 | 47 |
data3.nlargest(10, '경기수')
순위 | 선수명 | 팀명 | 타율 | 경기수 | 타수 | 득점 | 안타 | 2루타 | 3루타 | 홈런 | 타점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 7 | 김재환 | 두산 | 0.340 | 144 | 544 | 110 | 185 | 34 | 2 | 35 | 115 |
8 | 9 | 손아섭 | 롯데 | 0.335 | 144 | 576 | 113 | 193 | 35 | 4 | 20 | 80 |
12 | 13 | 이정후 | 넥센 | 0.324 | 144 | 552 | 111 | 179 | 29 | 8 | 2 | 47 |
22 | 23 | 구자욱 | 삼성 | 0.310 | 144 | 564 | 108 | 175 | 39 | 10 | 21 | 107 |
5 | 6 | 최형우 | KIA | 0.342 | 142 | 514 | 98 | 176 | 36 | 3 | 26 | 120 |
14 | 15 | 이대호 | 롯데 | 0.320 | 142 | 540 | 73 | 173 | 13 | 0 | 34 | 111 |
19 | 20 | 윤석민 | kt | 0.312 | 142 | 538 | 90 | 168 | 30 | 1 | 20 | 105 |
29 | 30 | 김하성 | 넥센 | 0.302 | 141 | 526 | 90 | 159 | 36 | 3 | 23 | 114 |
9 | 10 | 서건창 | 넥센 | 0.332 | 139 | 539 | 87 | 179 | 28 | 3 | 6 | 76 |
15 | 16 | 버나디나 | KIA | 0.320 | 139 | 557 | 118 | 178 | 26 | 8 | 27 | 111 |
Quiz¶
bp = pd.read_csv('C:\py_temp\농구선수_전체.csv', encoding = 'cp949')
bp.sort_values(['슛성공횟수_3점'], ascending = False).head(10).reset_index(drop=True)
선수이름 | 포지션 | 슛성공횟수_3점 | 리바운드성공횟수 | 블로킹성공횟수 | |
---|---|---|---|---|---|
0 | 곽재우 | 슈팅가드 | 3.4 | 3.7 | 0.5 |
1 | 신동훈 | 슈팅가드 | 3.3 | 2.7 | 0.5 |
2 | 김유신 | 슈팅가드 | 2.9 | 3.1 | 0.3 |
3 | 김옥균 | 슈팅가드 | 2.6 | 3.4 | 0.2 |
4 | 서채원 | 슈팅가드 | 2.6 | 2.2 | 0.2 |
5 | 원효대사 | 슈팅가드 | 2.4 | 3.5 | 0.2 |
6 | 동명왕 | 슈팅가드 | 2.4 | 2.8 | 0.3 |
7 | 장보고 | 슈팅가드 | 2.4 | 2.1 | 0.1 |
8 | 논개 | 슈팅가드 | 2.3 | 2.8 | 0.3 |
9 | 심순애 | 슈팅가드 | 2.3 | 3.6 | 0.5 |
ds_sale = pd.read_csv('C:\py_temp\DS_판매내역.csv', encoding = 'cp949')
ds_sale = ds_sale.loc[ds_sale['판매수량'] >= 5, ['판매점','제품명','판매수량']]
ds_sale.sort_values(['판매수량','제품명','판매점'], ascending = [False, True, False]).head(3)
판매점 | 제품명 | 판매수량 | |
---|---|---|---|
5 | 대박상회 | 맛동짱 | 25 |
8 | 또와요마트 | 새우짱 | 10 |
0 | 대박상회 | 새우짱 | 10 |
ds_sale = pd.read_csv(r'C:\py_temp\DS_판매내역.csv', encoding='cp949').query('판매수량 >= 5').sort_values(['판매수량', '제품명', '판매점'],\
ascending=[False, True, False]).head(3)[['판매점', '제품명', '판매수량']]
ds_sale
판매점 | 제품명 | 판매수량 | |
---|---|---|---|
5 | 대박상회 | 맛동짱 | 25 |
8 | 또와요마트 | 새우짱 | 10 |
0 | 대박상회 | 새우짱 | 10 |
중복값 제거
unique(): 컬럼명이 여럿이면 불가능
drop_duplicates(): 주로 사용
데이터프레임 관리하기
열 추가: data['컬럼명'] = ['', '' ...]
열 삭제: data = data.drop('컬럼명', axis=1) axis = 0: 행, axis = 1: 컬럼
원본 반영: inplace = True
행 삭제: data.drop(data[(조건)|(조건)].index)
데이터 결합
merge(): SQL의 INNER JOIN
pd.merge(a, b, how = 'outer', left_on = '', right_on = '')
concat():
pd.concat([df,df,df], axis =0).reset_index()
이상치(NA), 결측치(Null) 처리
dropna(): 결측값 제거
fillna(): 결측값 다른 값으로 대체
변수 형식 변환 - 날짜 등
astype(): 정수, 실수 등 / to_numeric: 숫자형 특화
pd.to_datetime(): 문자열로 로딩하는 것보다 date/datetime 타입으로 로딩하는 것이 분석에 용이
ex): date['날짜'] = pd.to_datetime(date['날짜'])
sale = pd.read_csv('C:\py_temp\판매2.csv', encoding = 'cp949')
sale
판매사원번호 | 고객번호 | 매장명 | |
---|---|---|---|
0 | 202201 | 1001.0 | 대박상회 |
1 | 202202 | 1001.0 | 다사마트 |
2 | 202208 | 1005.0 | 또와요마트 |
3 | 202209 | 1004.0 | 또와요마트 |
4 | 202210 | 1001.0 | 또와요마트 |
5 | 202211 | NaN | 대박상회 |
6 | 202212 | 1003.0 | NaN |
7 | 202213 | 1002.0 | 대박상회 |
sale.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 8 entries, 0 to 7 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 판매사원번호 8 non-null int64 1 고객번호 7 non-null float64 2 매장명 7 non-null object dtypes: float64(1), int64(1), object(1) memory usage: 324.0+ bytes
# null값 0으로 변경, 실수형 정수형으로 변경
sale['고객번호'] = sale['고객번호'].fillna(0).astype(int)
sale
판매사원번호 | 고객번호 | 매장명 | |
---|---|---|---|
0 | 202201 | 1001 | 대박상회 |
1 | 202202 | 1001 | 다사마트 |
2 | 202208 | 1005 | 또와요마트 |
3 | 202209 | 1004 | 또와요마트 |
4 | 202210 | 1001 | 또와요마트 |
5 | 202211 | 0 | 대박상회 |
6 | 202212 | 1003 | NaN |
7 | 202213 | 1002 | 대박상회 |
sale.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 8 entries, 0 to 7 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 판매사원번호 8 non-null int64 1 고객번호 8 non-null int32 2 매장명 7 non-null object dtypes: int32(1), int64(1), object(1) memory usage: 292.0+ bytes
# to_numeric 사용해서 숫자 형식으로 변환
sale['판매사원번호'] = pd.to_numeric(sale['판매사원번호'], errors='coerce')
sale.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 8 entries, 0 to 7 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 판매사원번호 8 non-null int64 1 고객번호 8 non-null int32 2 매장명 7 non-null object dtypes: int32(1), int64(1), object(1) memory usage: 292.0+ bytes
데이터 집계하기
groupby():
data.groupby('나눌 컬럼')['통계할 컬럼'].sum()
data.groupby(['팀명', '이름'].as_index = False)['매출'].sum()
count():
sum():
mean(): 평균
median(): 중앙값
Quiz¶
group1 = pd.read_excel('c:\py_temp\프로야구선수성적_타자.xlsx')
group1.groupby(['팀명'], as_index = False)['홈런'].sum().sort_values(['홈런'],ascending = False)
팀명 | 홈런 | |
---|---|---|
0 | KIA | 100 |
6 | 두산 | 95 |
7 | 롯데 | 87 |
8 | 삼성 | 52 |
9 | 한화 | 50 |
3 | SK | 46 |
2 | NC | 44 |
5 | 넥센 | 39 |
4 | kt | 33 |
1 | LG | 14 |
group2 = pd.read_csv('c:\py_temp\부품구입대장_전체.csv', encoding = 'cp949')
group2.groupby(['사업장', '품목'], as_index = False)['수량'].sum().sort_values(['수량', '사업장'], ascending = [False, True]).head(10)
사업장 | 품목 | 수량 | |
---|---|---|---|
58 | 광주 | PAPER BRSH | 419 |
125 | 광주 | 작업용장갑 | 343 |
888 | 충주 | OPP TAPE | 343 |
912 | 충주 | 강관방청유(외측) | 311 |
587 | 인천 | END MILL | 305 |
649 | 인천 | 마크펜 | 304 |
679 | 인천 | 의료품 | 298 |
837 | 충주 | AIR CYLINDER | 297 |
943 | 충주 | 안전장비D | 284 |
126 | 광주 | 전산용품 | 283 |
group3 = pd.read_csv('c:\py_temp\부품구입대장_전체.csv', encoding = 'cp949')
group3 = group3[group3['사업장'].str.contains('석수')]
group3.groupby(['사업장', '품목'], as_index = False)['수량'].sum().sort_values(['수량'], ascending = [False]).head(10)
사업장 | 품목 | 수량 | |
---|---|---|---|
94 | 석수 | 안전장비B | 158 |
50 | 석수 | PHOTO SENSOR | 152 |
98 | 석수 | 알코올 | 147 |
67 | 석수 | 강관조관유 | 146 |
4 | 석수 | AL TAPE | 143 |
87 | 석수 | 소모품 | 142 |
100 | 석수 | 액체질소 | 126 |
16 | 석수 | DIAL GAUGE | 122 |
110 | 석수 | 작업복B | 120 |
116 | 석수 | 종이컵 | 113 |
피벗 테이블 생성¶
pd.pivot_table() - 엑셀의 pivot
index: 그룹핑할 기준
values: 평균값을 출력, 숫자 데이터
pd.options.display.float_format = '{:.10f}'.format
aggfunc: 기본값 mean 대신 사용할 집계함수
pi = pd.read_excel('c:\py_temp\pivot_test.xlsx')
pd.options.display.float_format = '{:.2f}'.format
pi
신청날짜 | 사업장 | 품목코드 | 품목 | 수량 | 단가 | 금액 | |
---|---|---|---|---|---|---|---|
0 | 2019-01-01 | 광주 | MF4-941 | 배관자재 | 25 | 3000 | 75000 |
1 | 2019-01-01 | 대구 | MF8-340 | 청소용구A | 45 | 13000 | 585000 |
2 | 2019-01-01 | 성남 | MF8-472 | BRUSH | 8 | 3000 | 24000 |
3 | 2019-01-01 | 성남 | MF6-844 | LOCATION PIN | 31 | 790000 | 24490000 |
4 | 2019-01-01 | 성남 | MF5-661 | S45C봉 | 20 | 70000 | 1400000 |
5 | 2019-01-01 | 인천 | MF7-708 | AIR BOX | 43 | 220000 | 9460000 |
6 | 2019-01-01 | 인천 | MF7-762 | 알코올 | 12 | 8000 | 96000 |
7 | 2019-01-01 | 인천 | MF3-997 | 철사 | 13 | 20000 | 260000 |
8 | 2019-01-01 | 충주 | MF6-087 | MOLD SPRING | 6 | 30000 | 180000 |
9 | 2019-01-02 | 광주 | MF1-578 | GUIDE PIN | 1 | 35000 | 35000 |
10 | 2019-01-02 | 광주 | MF8-351 | RELAY SWITCH | 28 | 13000 | 364000 |
11 | 2019-01-02 | 광주 | MF7-918 | 붕산 | 5 | 7000 | 35000 |
12 | 2019-01-02 | 대구 | MF8-130 | O-RING | 32 | 46000 | 1472000 |
13 | 2019-01-02 | 대구 | MF1-968 | 경유 | 3 | 80000 | 240000 |
14 | 2019-01-02 | 대구 | MF3-336 | 스치로폴 | 12 | 30000 | 360000 |
15 | 2019-01-02 | 대구 | MF3-456 | 전선(동력선) | 31 | 9500 | 294500 |
16 | 2019-01-02 | 석수 | MF7-982 | 안전장비B | 42 | 25000 | 1050000 |
17 | 2019-01-02 | 성남 | MF2-524 | RECEPTACLE | 28 | 10000 | 280000 |
18 | 2019-01-02 | 성남 | MF9-695 | 안전장비B | 11 | 25000 | 275000 |
19 | 2019-01-02 | 성남 | MF2-638 | 안전장비C | 38 | 30000 | 1140000 |
20 | 2019-01-02 | 인천 | MF3-988 | 배관자재 | 9 | 3000 | 27000 |
21 | 2019-01-02 | 인천 | MF2-539 | 의료품 | 3 | 2500000 | 7500000 |
22 | 2019-01-02 | 천안 | MF2-746 | 백관 | 18 | 56000 | 1008000 |
23 | 2019-01-02 | 충주 | MF5-805 | PUSH BUTTON S/W | 30 | 15000 | 450000 |
24 | 2019-01-03 | 광주 | MF5-569 | AIR COUPLER | 22 | 30000 | 660000 |
25 | 2019-01-03 | 광주 | MF3-095 | LIFTER PIN SET | 23 | 180000 | 4140000 |
26 | 2019-01-03 | 광주 | MF3-927 | 파일/바인더류 | 38 | 2500 | 95000 |
27 | 2019-01-03 | 석수 | MF5-936 | 안전장비B | 36 | 25000 | 900000 |
28 | 2019-01-03 | 성남 | MF8-073 | LIMIT SWITCH | 34 | 74000 | 2516000 |
29 | 2019-01-03 | 인천 | MF6-103 | BEARING | 16 | 75000 | 1200000 |
30 | 2019-01-03 | 인천 | MF4-601 | Pipe | 46 | 530000 | 24380000 |
31 | 2019-01-03 | 인천 | MF7-648 | 브레이크액 | 50 | 50000 | 2500000 |
32 | 2019-01-03 | 인천 | MF6-974 | 소모품 | 39 | 2200 | 85800 |
33 | 2019-01-03 | 충주 | MF6-287 | 의료품 | 8 | 2500000 | 20000000 |
34 | 2019-01-04 | 광주 | MF2-484 | HOOK | 46 | 170000 | 7820000 |
35 | 2019-01-04 | 광주 | MF3-485 | P/Z O-RING | 4 | 38000 | 152000 |
36 | 2019-01-04 | 광주 | MF1-177 | PUSH BUTTON S/W | 1 | 15000 | 15000 |
37 | 2019-01-04 | 대구 | MF5-310 | POWER SUPPLY | 43 | 60000 | 2580000 |
38 | 2019-01-04 | 대구 | MF8-470 | 윤활유 | 24 | 2000000 | 48000000 |
39 | 2019-01-04 | 석수 | MF6-258 | 면장갑 | 43 | 800 | 34400 |
40 | 2019-01-04 | 성남 | MF3-892 | 일반사무용품류 | 22 | 2100 | 46200 |
41 | 2019-01-04 | 인천 | MF2-590 | COIL SPRING | 41 | 200000 | 8200000 |
42 | 2019-01-04 | 인천 | MF4-319 | 용접장갑 | 4 | 38000 | 152000 |
43 | 2019-01-04 | 천안 | MF7-777 | S45C(봉) | 6 | 45000 | 270000 |
44 | 2019-01-04 | 천안 | MF5-414 | 청소용구B | 2 | 22000 | 44000 |
45 | 2019-01-04 | 충주 | MF5-926 | HOOK | 10 | 170000 | 1700000 |
46 | 2019-01-04 | 충주 | MF5-236 | 액체질소 | 45 | 2000 | 90000 |
47 | 2019-01-05 | 광주 | MF6-645 | PAPER BRSH | 9 | 40000 | 360000 |
48 | 2019-01-05 | 광주 | MF2-708 | 종이컵 | 42 | 6000 | 252000 |
49 | 2019-01-05 | 대구 | MF2-969 | 가공유 | 12 | 500000 | 6000000 |
50 | 2019-01-05 | 대구 | MF4-438 | 용접장갑 | 15 | 38000 | 570000 |
51 | 2019-01-05 | 석수 | MF5-362 | 작업복B | 1 | 33000 | 33000 |
52 | 2019-01-05 | 인천 | MF7-633 | GAUGE | 40 | 15000 | 600000 |
53 | 2019-01-05 | 인천 | MF7-235 | 백관 | 6 | 56000 | 336000 |
54 | 2019-01-05 | 천안 | MF9-276 | 필기구류 | 41 | 1500 | 61500 |
55 | 2019-01-05 | 충주 | MF1-688 | 목재 | 5 | 6700 | 33500 |
pi = pd.pivot_table(pi, index = '사업장', values = ['금액', '단가', '수량'])
pd.options.display.float_format = '{:.10f}'.format
pi
금액 | 단가 | 수량 | |
---|---|---|---|
사업장 | |||
광주 | 1166916.6666666667 | 44958.3333333333 | 20.3333333333 |
대구 | 6677944.4444444440 | 308500.0000000000 | 24.1111111111 |
석수 | 504350.0000000000 | 20950.0000000000 | 30.5000000000 |
성남 | 3771400.0000000000 | 125512.5000000000 | 24.0000000000 |
인천 | 4215138.4615384620 | 285938.4615384616 | 24.7692307692 |
천안 | 345875.0000000000 | 31125.0000000000 | 16.7500000000 |
충주 | 3742250.0000000000 | 453950.0000000000 | 17.3333333333 |
'PYTHON > 기타' 카테고리의 다른 글
[나도코딩] 파이썬 웹 스크래핑(Web Scraping)(User_Agent, BeautifulSoup4) (2) | 2024.01.10 |
---|---|
[데이터 분석] 파이썬 태양열 신재생 에너지 분석(수평면 산란 일사량,풍속과 태양열 발전량의 상관관계) (0) | 2024.01.05 |
[데이터 분석] Matplotlib, Seaborn 연습 (0) | 2024.01.05 |
[나도코딩] 파이썬 웹스크래핑(Web Scraping)(HTML, XPath, Requests, 정규식) (2) | 2023.12.23 |
[데이터 분석] 파이썬 쇼핑몰 매출 분석(월별, 요일별, 품목별, 연령대별)을 통한 인사이트 도출과 마케팅 전략 제안 (0) | 2023.12.12 |