3강. 자유자재의 데이터 가공
-
둘째마당 (06)
-
pp.131-176 (46쪽)
06-1. 데이터 전처리 - 원하는 형태로 데이터 가공하기(132쪽)
주요 함수들
-
query( ) : 행 추출
-
df[ ] : 열(변수) 추출
-
sort_value( ) : 정렬
-
groupby( ) : 집단별로 나누기
-
assign( ) : 변수 추가
-
agg( ) : 통계치 구하기
-
merge( ) : 데이터 합치기(열)
-
concat( ) : 데이터 합치기(행)
06-2. 조건에 맞는 데이터만 추출하기(133-142쪽)
[Do it! 실습] 조건에 맞는 데이터만 추출하기(133쪽)
import pandas as pd
exam = pd.read_csv('exam.csv')
exam
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# exam에서 nclass가 1인 경우만 추출
exam.query('nclass == 1') # '=='와 '='를 구별
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
# 2반의 경우만 추출
exam.query('nclass == 2')
|
id |
nclass |
math |
english |
science |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
# 1반이 아닌 경우
exam.query('nclass != 1')
|
id |
nclass |
math |
english |
science |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# 3반이 아닌 경우
exam.query('nclass != 3')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
[Do it! 실습] 초과, 미만, 이상, 이하 조건 걸기(136쪽)
# 수학 점수가 50점을 초과한 경우
exam.query('math > 50')
|
id |
nclass |
math |
english |
science |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# 수학 점수가 50점 미만인 경우
exam.query('math < 50')
|
id |
nclass |
math |
english |
science |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
# 영어 점수가 50점 이상인 경우
exam.query('english >= 50')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
[Do it! 실습] 여러 조건을 충족하는 행 추출하기(138쪽)
# 1반이면서 수학 점수가 50점 이상인 경우
exam.query('nclass == 1 & math >= 50')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
# 2반이면서 영어 점수가 80점 이상인 경우
exam.query('nclass == 2 & english >= 80')
|
id |
nclass |
math |
english |
science |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
[Do it! 실습] 여러 조건 중 하나 이상 충족하는 행 추출하기(138쪽)
# 수학 점수가 90점 이상이거나 영어 점수가 90점 이상인 경우
exam.query('math >= 90 | english >= 90')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 15 |
16 |
4 |
58 |
98 |
65 |
# 영어 점수가 90점 미만이거나 과학 점수가 50점 미만인 경우
exam.query('english < 90 | science < 50')
|
id |
nclass |
math |
english |
science |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
[Do it! 실습] 목록에 해당하는 행 추출하기(139쪽)
# 1, 3, 5반에 해당하면 추출
exam.query('nclass == 1 | nclass == 3 | nclass == 5')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# 1, 3, 5반에 해당하면 추출 : in과 []를 사용
exam.query('nclass in [1, 3, 5]')
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
[Do it! 실습] 추출한 행으로 데이터 만들기(140쪽)
# nclass가 1인 행 추출해 nclass1에 할당
nclass1 = exam.query('nclass == 1')
# nclass가 2인 행 추출해 nclass1에 할당
nclass2 = exam.query('nclass == 2')
nclass1['math'].mean() # 1반 수학 점수 평균 구하기
46.25
nclass2['math'].mean() # 2반 수학 점수 평균 구하기
61.25
[Do it! 실습] 문자 변수를 이용해 조건에 맞는 행 추출하기(141쪽)
-
전체 조건을 감싸는 따옴표와, 추출할 문자를 감싸는 따옴표를 서로 다른 모양으로 입력해야 함.
-
query(‘ ‘)처럼 작은 따옴표로 감쌌다면, 추출할 문자는 var == “ “처럼 큰 따옴표로 감싸야 함.
df = pd.DataFrame({'sex' : ['F', 'M', 'F', 'M'],
'country' : ['Korea', 'China', 'Japan', 'USA']})
df
|
sex |
country |
| 0 |
F |
Korea |
| 1 |
M |
China |
| 2 |
F |
Japan |
| 3 |
M |
USA |
# 전체 조건에 작은따옴표, 추출할 문자에 큰따옴표 사용: 여성 & 한국
df.query('sex == "F" & country == "Korea"')
# 반대로 전체 조건을 큰따옴표로 감쌌다면 추출할 문자는 작은따옴표로 감싸야 함: 남성 & 중국
df.query("sex == 'M' & country == 'China'")
# 전체 조건과 추출할 문자에 모두 작은따옴표 사용 => 에러
df.query('sex == 'F' & country == 'Korea'')
[개인 실습] 혼자서 해보기(144쪽)
- mpg 데이터를 이용해 분석 문제를 해결해 보세요
Q1 : 자동차 배기량에 따른 고속도로 연비
- displ(배기량)이 4 이하인 자동차와 5 이상인 자동차 중 어떤 자동차의 hwy(고속도로 연비) 평균이 더 높은지 알아보세요
# mpg.csv 파일을 불러와서 변수 mpg에 넣어라
mpg = pd.read_csv('mpg.csv')
mpg
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
| 3 |
audi |
a4 |
2.0 |
2008 |
4 |
auto(av) |
f |
21 |
30 |
p |
compact |
| 4 |
audi |
a4 |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
compact |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 229 |
volkswagen |
passat |
2.0 |
2008 |
4 |
auto(s6) |
f |
19 |
28 |
p |
midsize |
| 230 |
volkswagen |
passat |
2.0 |
2008 |
4 |
manual(m6) |
f |
21 |
29 |
p |
midsize |
| 231 |
volkswagen |
passat |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
midsize |
| 232 |
volkswagen |
passat |
2.8 |
1999 |
6 |
manual(m5) |
f |
18 |
26 |
p |
midsize |
| 233 |
volkswagen |
passat |
3.6 |
2008 |
6 |
auto(s6) |
f |
17 |
26 |
p |
midsize |
234 rows × 11 columns
# 배기량(disp) 4 이하 자동차를 추출해서 변수 car_until4에 넣어라
car_until4 = mpg.query('displ <= 4')
# 배기량(disp) 5 이상 자동차를 추출해서 변수 car_from5에 넣어라
car_from5 = mpg.query('displ >= 5')
# 두 종류 자동차의 고속도로 연비(hwy) 평균을 각각 출력하고 어느 쪽이 높은지 비교하라.
print(car_until4['hwy'].mean())
print(car_from5['hwy'].mean())
25.96319018404908
18.07894736842105
Q2 : 자동차 제조 회사별 도시 연비
- ‘audi’와 ‘toyota’ 중 어느 manufacturer(자동차 제조 회사)의 cty(도시 연비) 평균이 더 높은지 알아보세요
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
# 아우디와 토요타 회사를 각각 추출해서 audi, toyota라는 변수에 각각 할당하라.
audi = mpg.query('manufacturer == "audi"')
toyota = mpg.query('manufacturer == "toyota"')
# 두 회사 자동차의 도시 연비(cty) 평균을 각각 출력하고 어느 쪽이 높은지 비교하라.
print(audi['cty'].mean())
print(toyota['cty'].mean())
17.61111111111111
18.529411764705884
Q3 : 자동차별 고속도로 연비
- ‘chevrolet’, ‘ford’, ‘honda’ 자동차의 고속도로 연비 평균을 알아보려고 합니다. 세 회사의 데이터를 추출한 다음 hwy 전체 평균을 구해 보세요
# 세 회사의 데이터를 각각 추출하여, chevrolet, ford, honda라는 변수에 각각 할당하라.
chevrolet = mpg.query("manufacturer == 'chevrolet'")
ford = mpg.query("manufacturer == 'ford'")
honda = mpg.query("manufacturer == 'honda'")
# 세 회사 자동차의 고속도로 연비(hwy) 평균을 각각 출력하라.
print(chevrolet['hwy'].mean())
print(ford['hwy'].mean())
print(honda['hwy'].mean())
21.894736842105264
19.36
32.55555555555556
# 세 회사 고속도로 연비의 전체 평균을 구하라 (in, [ ] 사용). 변수는 three_manu에 할당.
three_manu = mpg.query("manufacturer in ['chevrolet', 'ford', 'honda']")
three_manu['hwy'].mean()
22.50943396226415
06-3. 필요한 변수만 추출하기(145-150쪽)
[Do it! 실습] 변수 추출하기(145쪽)
# exam에서 math 변수만 추출하기
exam['math']
0 50
1 60
2 45
3 30
4 25
5 50
6 80
7 90
8 20
9 50
10 65
11 45
12 46
13 48
14 75
15 58
16 65
17 80
18 89
19 78
Name: math, dtype: int64
# exam에서 english 변수만 추출하기
exam['english']
0 98
1 97
2 86
3 98
4 80
5 89
6 90
7 78
8 98
9 98
10 65
11 85
12 98
13 87
14 56
15 98
16 68
17 78
18 68
19 83
Name: english, dtype: int64
# 여러 변수 추출하기
exam[['nclass', 'math', 'english']]
|
nclass |
math |
english |
| 0 |
1 |
50 |
98 |
| 1 |
1 |
60 |
97 |
| 2 |
1 |
45 |
86 |
| 3 |
1 |
30 |
98 |
| 4 |
2 |
25 |
80 |
| 5 |
2 |
50 |
89 |
| 6 |
2 |
80 |
90 |
| 7 |
2 |
90 |
78 |
| 8 |
3 |
20 |
98 |
| 9 |
3 |
50 |
98 |
| 10 |
3 |
65 |
65 |
| 11 |
3 |
45 |
85 |
| 12 |
4 |
46 |
98 |
| 13 |
4 |
48 |
87 |
| 14 |
4 |
75 |
56 |
| 15 |
4 |
58 |
98 |
| 16 |
5 |
65 |
68 |
| 17 |
5 |
80 |
78 |
| 18 |
5 |
89 |
68 |
| 19 |
5 |
78 |
83 |
[Do it! 실습] 변수 제거하기(147쪽)
exam.drop(columns = 'math') # math 제거
|
id |
nclass |
english |
science |
| 0 |
1 |
1 |
98 |
50 |
| 1 |
2 |
1 |
97 |
60 |
| 2 |
3 |
1 |
86 |
78 |
| 3 |
4 |
1 |
98 |
58 |
| 4 |
5 |
2 |
80 |
65 |
| 5 |
6 |
2 |
89 |
98 |
| 6 |
7 |
2 |
90 |
45 |
| 7 |
8 |
2 |
78 |
25 |
| 8 |
9 |
3 |
98 |
15 |
| 9 |
10 |
3 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
| 11 |
12 |
3 |
85 |
32 |
| 12 |
13 |
4 |
98 |
65 |
| 13 |
14 |
4 |
87 |
12 |
| 14 |
15 |
4 |
56 |
78 |
| 15 |
16 |
4 |
98 |
65 |
| 16 |
17 |
5 |
68 |
98 |
| 17 |
18 |
5 |
78 |
90 |
| 18 |
19 |
5 |
68 |
87 |
| 19 |
20 |
5 |
83 |
58 |
# 여러 변수 제거
exam.drop(columns = ['math', 'english'])
|
id |
nclass |
science |
| 0 |
1 |
1 |
50 |
| 1 |
2 |
1 |
60 |
| 2 |
3 |
1 |
78 |
| 3 |
4 |
1 |
58 |
| 4 |
5 |
2 |
65 |
| 5 |
6 |
2 |
98 |
| 6 |
7 |
2 |
45 |
| 7 |
8 |
2 |
25 |
| 8 |
9 |
3 |
15 |
| 9 |
10 |
3 |
45 |
| 10 |
11 |
3 |
65 |
| 11 |
12 |
3 |
32 |
| 12 |
13 |
4 |
65 |
| 13 |
14 |
4 |
12 |
| 14 |
15 |
4 |
78 |
| 15 |
16 |
4 |
65 |
| 16 |
17 |
5 |
98 |
| 17 |
18 |
5 |
90 |
| 18 |
19 |
5 |
87 |
| 19 |
20 |
5 |
58 |
[Do it! 실습] pandas 함수 조합하기(148쪽)
# query()와 [] 조합하기
# - 1반 학생의 영어 점수 추출
exam.query('nclass == 1')['english']
0 98
1 97
2 86
3 98
Name: english, dtype: int64
# - 수학 점수가 50점 이상인 학생의 id와 math 변수 추출
exam.query('math >= 50')[['id', 'math']]
|
id |
math |
| 0 |
1 |
50 |
| 1 |
2 |
60 |
| 5 |
6 |
50 |
| 6 |
7 |
80 |
| 7 |
8 |
90 |
| 9 |
10 |
50 |
| 10 |
11 |
65 |
| 14 |
15 |
75 |
| 15 |
16 |
58 |
| 16 |
17 |
65 |
| 17 |
18 |
80 |
| 18 |
19 |
89 |
| 19 |
20 |
78 |
# 일부만 출력하기
# - math가 50 이상인 행만 추출한 다음, id, math 앞부분 5행까지 추출
exam.query('math >= 50')[['id', 'math']].head()
|
id |
math |
| 0 |
1 |
50 |
| 1 |
2 |
60 |
| 5 |
6 |
50 |
| 6 |
7 |
80 |
| 7 |
8 |
90 |
# - math가 50 이상인 행만 추출한 다음 id, math 앞부분 10행까지 추출
exam.query('math >= 50')[['id', 'math']].head(10)
|
id |
math |
| 0 |
1 |
50 |
| 1 |
2 |
60 |
| 5 |
6 |
50 |
| 6 |
7 |
80 |
| 7 |
8 |
90 |
| 9 |
10 |
50 |
| 10 |
11 |
65 |
| 14 |
15 |
75 |
| 15 |
16 |
58 |
| 16 |
17 |
65 |
[Do it! 실습] 가독성 있게 코드 줄 바꾸기(150쪽)
exam.query('math > 50') \
[['id', 'math']] \
.head(10)
|
id |
math |
| 1 |
2 |
60 |
| 6 |
7 |
80 |
| 7 |
8 |
90 |
| 10 |
11 |
65 |
| 14 |
15 |
75 |
| 15 |
16 |
58 |
| 16 |
17 |
65 |
| 17 |
18 |
80 |
| 18 |
19 |
89 |
| 19 |
20 |
78 |
[개인 실습] 혼자서 해보기(150쪽)
- mpg 데이터를 이용해서 분석 문제를 해결하시오
Q1. category, cty 변수 추출
- mpg 데이터는 11개 변수로 구성. 이 중 category(자동차 종류), cty(도시 연비) 변수를 추출해서 새로운 데이터를 만드세요.
mpg = pd.read_csv('mpg.csv')
mpg.shape
(234, 11)
# 'category', 'cty' 두 변수로 된 df를 mpg_new 변수에 할당
mpg_new = mpg[['category', 'cty']]
mpg_new
|
category |
cty |
| 0 |
compact |
18 |
| 1 |
compact |
21 |
| 2 |
compact |
20 |
| 3 |
compact |
21 |
| 4 |
compact |
16 |
| ... |
... |
... |
| 229 |
midsize |
19 |
| 230 |
midsize |
21 |
| 231 |
midsize |
16 |
| 232 |
midsize |
18 |
| 233 |
midsize |
17 |
234 rows × 2 columns
Q2 : 자동차 종류별 연비
- 앞에서 추출한 데이터를 이용해 category가 ‘suv’인 자동차와, ‘compact’인 자동차 중 어떤 자동차의 cty 평균이 더 높은지 알아보시오.
mpg_new.query('category == "suv"')['cty'].mean()
13.5
mpg_new.query('category == "compact"')['cty'].mean()
20.127659574468087
06-4. 순서대로 정렬하기(151-153쪽)
[Do it! 실습] 오름차순으로 정렬하기(151쪽)
# excel_exam.xlsx 데이터 불러와서 변수 exam에 넣어라
exam = pd.read_excel('excel_exam.xlsx')
exam
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# exam 데이터를 수학점수 낮은 사람부터 높은 사람 순으로 오름차순 정렬하기
exam.sort_values(['math'])
|
id |
nclass |
math |
english |
science |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 19 |
20 |
5 |
78 |
83 |
58 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 7 |
8 |
2 |
90 |
78 |
25 |
[Do it! 실습] 내림차순으로 정렬하기(152쪽)
exam.sort_values(['math'], ascending = False) # math 내림차순 정렬
|
id |
nclass |
math |
english |
science |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 19 |
20 |
5 |
78 |
83 |
58 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 8 |
9 |
3 |
20 |
98 |
15 |
[Do it! 실습] 여러 정렬 기준 적용하기(152쪽)
# 먼저 반을 기준으로 오름차순 정렬한 다음, 각 반에서 수학 점수를 기준으로 오름차순 정렬
exam.sort_values(['nclass', 'math'])
|
id |
nclass |
math |
english |
science |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 19 |
20 |
5 |
78 |
83 |
58 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
# 먼저 반을 기준으로 오름차순 정렬한 다음, 각 반에서 수학 점수를 기준으로 내림차순 정렬할 경우
exam.sort_values(['nclass', 'math'], ascending = [True, False])
|
id |
nclass |
math |
english |
science |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 19 |
20 |
5 |
78 |
83 |
58 |
| 16 |
17 |
5 |
65 |
68 |
98 |
[개인 실습] 혼자서 해보기(153쪽)
Q1 : ‘audi’가 생산한 자동차 중 높은 연비 모델
- ‘audi’가 생산한 자동차 중에 어떤 자동차 모델의 hwy(고속도로 연비)가 높은지 알아보려 한다. hwy가 1~5위인 자동차의 데이터를 출력하라
# mpg.csv 파일 불러와서 변수 mpg에 할당하라
mpg = pd.read_csv('mpg.csv')
mpg.head(3)
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
# audi 생산 자동차 중 hwy 상위 1-5위 자동차 데이터 출력
mpg.query('manufacturer == "audi"') \
.sort_values(['hwy'], \
ascending = False) \
.head()
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
| 3 |
audi |
a4 |
2.0 |
2008 |
4 |
auto(av) |
f |
21 |
30 |
p |
compact |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 9 |
audi |
a4 quattro |
2.0 |
2008 |
4 |
manual(m6) |
4 |
20 |
28 |
p |
compact |
06-5. 파생변수 추가하기(154-158쪽)
[Do it! 실습] 파생변수 추가하기(154쪽)
- exam 세 과목 점수를 합한 총점 변수 추가하기
# excel_exam.xlsx 데이터 불러와서 변수 exam에 넣어라
exam = pd.read_excel('excel_exam.xlsx')
exam
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# assign() 이용하여 수학, 영어, 과학 점수 합계를 total 변수에 저장 - 새로 만들 변수명에는 따옴표를 입력하지 않음 !!
exam.assign(total = exam['math'] + exam['english'] + exam['science'])
|
id |
nclass |
math |
english |
science |
total |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
# 여러 파생변수 한 번에 추가: 세 과목 합계 점수는 total, 세 과목 평균 점수는 mean 변수에 할당
exam.assign(
total = exam['math'] + exam['english'] + exam['science'],
mean = (exam['math'] + exam['english'] + exam['science']) / 3)
|
id |
nclass |
math |
english |
science |
total |
mean |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
66.000000 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
72.333333 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
69.666667 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
62.000000 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
56.666667 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
79.000000 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
71.666667 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
64.333333 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
44.333333 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
64.333333 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
65.000000 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
54.000000 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
69.666667 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
49.000000 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
69.666667 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
73.666667 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
77.000000 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
82.666667 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
81.333333 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
73.000000 |
[Do it! 실습] df.assign( )에 np.where( ) 적용하기(156쪽)
- 조건에 따라 다른 값을 부여한 변수를 추가할 수 있음
import numpy as np
# 과학 점수가 60점 이상일 때 pass, 60점 미만일 때 fall을 변수 test에 입력하라
exam.assign(test = np.where(exam['science'] >= 60, 'pass', 'fall'))
|
id |
nclass |
math |
english |
science |
test |
| 0 |
1 |
1 |
50 |
98 |
50 |
fall |
| 1 |
2 |
1 |
60 |
97 |
60 |
pass |
| 2 |
3 |
1 |
45 |
86 |
78 |
pass |
| 3 |
4 |
1 |
30 |
98 |
58 |
fall |
| 4 |
5 |
2 |
25 |
80 |
65 |
pass |
| 5 |
6 |
2 |
50 |
89 |
98 |
pass |
| 6 |
7 |
2 |
80 |
90 |
45 |
fall |
| 7 |
8 |
2 |
90 |
78 |
25 |
fall |
| 8 |
9 |
3 |
20 |
98 |
15 |
fall |
| 9 |
10 |
3 |
50 |
98 |
45 |
fall |
| 10 |
11 |
3 |
65 |
65 |
65 |
pass |
| 11 |
12 |
3 |
45 |
85 |
32 |
fall |
| 12 |
13 |
4 |
46 |
98 |
65 |
pass |
| 13 |
14 |
4 |
48 |
87 |
12 |
fall |
| 14 |
15 |
4 |
75 |
56 |
78 |
pass |
| 15 |
16 |
4 |
58 |
98 |
65 |
pass |
| 16 |
17 |
5 |
65 |
68 |
98 |
pass |
| 17 |
18 |
5 |
80 |
78 |
90 |
pass |
| 18 |
19 |
5 |
89 |
68 |
87 |
pass |
| 19 |
20 |
5 |
78 |
83 |
58 |
fall |
[Do it! 실습] 추가한 변수를 pandas 함수에 바로 활용하기(156쪽)
# total 변수 추가하고 total의 값을 오름차순으로 정렬하라
exam.assign(total = exam['math'] + exam['english'] + exam['science']) \
.sort_values(['total'])
|
id |
nclass |
math |
english |
science |
total |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
[Do it! 실습] lambda 이용해 데이터 프레임명 줄여 쓰기(157쪽)
- lambda x: 는 데이터 프레임명 자리에 x를 입력하겠다는 의미 -> 코드가 간결해짐
# exam.csv 파일 불러와서 변수 long_name에 저장하라
long_name = pd.read_csv('exam.csv')
long_name
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# 세 과목 합계를 new 변수에 할당: (종전대로) long_name라는 변수명을 직접 입력
long_name.assign(new = long_name['math'] + long_name['english'] + long_name['science'])
|
id |
nclass |
math |
english |
science |
new |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
# long_name 변수 대신 lambda와 x를 입력
long_name.assign(new = lambda x: x['math'] + x['english'] + x['science'])
|
id |
nclass |
math |
english |
science |
new |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
# 앞에서 만든 변수를 활용해 다시 변수 만들기 (파생 변수를 이용해서 다시 파생 변수를 만들 때)
exam.assign(total = exam['math'] + exam['english'] + exam['science'],
mean = lambda x: x['total'] / 3) # 코드를 읽기 불편 -> 두 행 모두 lambda 사용(다음 셀)
|
id |
nclass |
math |
english |
science |
total |
mean |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
66.000000 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
72.333333 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
69.666667 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
62.000000 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
56.666667 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
79.000000 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
71.666667 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
64.333333 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
44.333333 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
64.333333 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
65.000000 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
54.000000 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
69.666667 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
49.000000 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
69.666667 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
73.666667 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
77.000000 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
82.666667 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
81.333333 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
73.000000 |
# 좀 더 가독성이 높은 코드
exam.assign(total = lambda x: x['math'] + x['english'] + x['science'],
mean = lambda x: x['total'] / 3)
|
id |
nclass |
math |
english |
science |
total |
mean |
| 0 |
1 |
1 |
50 |
98 |
50 |
198 |
66.000000 |
| 1 |
2 |
1 |
60 |
97 |
60 |
217 |
72.333333 |
| 2 |
3 |
1 |
45 |
86 |
78 |
209 |
69.666667 |
| 3 |
4 |
1 |
30 |
98 |
58 |
186 |
62.000000 |
| 4 |
5 |
2 |
25 |
80 |
65 |
170 |
56.666667 |
| 5 |
6 |
2 |
50 |
89 |
98 |
237 |
79.000000 |
| 6 |
7 |
2 |
80 |
90 |
45 |
215 |
71.666667 |
| 7 |
8 |
2 |
90 |
78 |
25 |
193 |
64.333333 |
| 8 |
9 |
3 |
20 |
98 |
15 |
133 |
44.333333 |
| 9 |
10 |
3 |
50 |
98 |
45 |
193 |
64.333333 |
| 10 |
11 |
3 |
65 |
65 |
65 |
195 |
65.000000 |
| 11 |
12 |
3 |
45 |
85 |
32 |
162 |
54.000000 |
| 12 |
13 |
4 |
46 |
98 |
65 |
209 |
69.666667 |
| 13 |
14 |
4 |
48 |
87 |
12 |
147 |
49.000000 |
| 14 |
15 |
4 |
75 |
56 |
78 |
209 |
69.666667 |
| 15 |
16 |
4 |
58 |
98 |
65 |
221 |
73.666667 |
| 16 |
17 |
5 |
65 |
68 |
98 |
231 |
77.000000 |
| 17 |
18 |
5 |
80 |
78 |
90 |
248 |
82.666667 |
| 18 |
19 |
5 |
89 |
68 |
87 |
244 |
81.333333 |
| 19 |
20 |
5 |
78 |
83 |
58 |
219 |
73.000000 |
exam.assign(total = exam['math'] + exam['english'] + exam['science'],
mean = exam['total'] / 3)
[개인 실습] 혼자서 해보기(158쪽)
- mpg 데이터는 연비를 나타내는 변수가 hwy(고속도로 연비), cty(도시 연비) 두 종류로 분리되어 있다. 두 변수를 각각 활용하는 대신 하나의 합산 연비 변수를 만들어 분석하려고 한다.
Q1 : mpg 데이터 복사본을 만들고, cty와 hwy를 더한 ‘합산 연비 변수’를 추가하시오
- 힌트: df.assign()을 적용한 결과를 ‘=’ 을 이용해 데이터 프레임에 할당하는 형태로 코드를 작성해야 함
# mpg.csv 파일 불러와서 mpg에 할당하고 다시 이것을 복사해서 mpg_new 변수에 저장하라
mpg = pd.read_csv('mpg.csv')
mpg_new = mpg.copy()
mpg_new
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
| 3 |
audi |
a4 |
2.0 |
2008 |
4 |
auto(av) |
f |
21 |
30 |
p |
compact |
| 4 |
audi |
a4 |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
compact |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 229 |
volkswagen |
passat |
2.0 |
2008 |
4 |
auto(s6) |
f |
19 |
28 |
p |
midsize |
| 230 |
volkswagen |
passat |
2.0 |
2008 |
4 |
manual(m6) |
f |
21 |
29 |
p |
midsize |
| 231 |
volkswagen |
passat |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
midsize |
| 232 |
volkswagen |
passat |
2.8 |
1999 |
6 |
manual(m5) |
f |
18 |
26 |
p |
midsize |
| 233 |
volkswagen |
passat |
3.6 |
2008 |
6 |
auto(s6) |
f |
17 |
26 |
p |
midsize |
234 rows × 11 columns
# 도시 연비와 고속도로 연비를 합한 값을 total 변수에 할당한 뒤 결과 df를 다시 mpg_new 변수에 담아라
mpg_new = mpg_new.assign(total = mpg_new['cty'] + mpg_new['hwy'])
mpg_new
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
total |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
47 |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
50 |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
51 |
| 3 |
audi |
a4 |
2.0 |
2008 |
4 |
auto(av) |
f |
21 |
30 |
p |
compact |
51 |
| 4 |
audi |
a4 |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
compact |
42 |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 229 |
volkswagen |
passat |
2.0 |
2008 |
4 |
auto(s6) |
f |
19 |
28 |
p |
midsize |
47 |
| 230 |
volkswagen |
passat |
2.0 |
2008 |
4 |
manual(m6) |
f |
21 |
29 |
p |
midsize |
50 |
| 231 |
volkswagen |
passat |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
midsize |
42 |
| 232 |
volkswagen |
passat |
2.8 |
1999 |
6 |
manual(m5) |
f |
18 |
26 |
p |
midsize |
44 |
| 233 |
volkswagen |
passat |
3.6 |
2008 |
6 |
auto(s6) |
f |
17 |
26 |
p |
midsize |
43 |
234 rows × 12 columns
Q2 : 앞에서 만든 ‘합산 연비 변수’를 2로 나눠 ‘평균 연비 변수’를 추가하세요
# 평균 연비 변수를 mean에 할당하라
mpg_new = mpg_new.assign(mean = mpg_new['total'] / 2)
mpg_new
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
total |
average |
mean |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
47 |
23.5 |
23.5 |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
50 |
25.0 |
25.0 |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
51 |
25.5 |
25.5 |
| 3 |
audi |
a4 |
2.0 |
2008 |
4 |
auto(av) |
f |
21 |
30 |
p |
compact |
51 |
25.5 |
25.5 |
| 4 |
audi |
a4 |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
compact |
42 |
21.0 |
21.0 |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 229 |
volkswagen |
passat |
2.0 |
2008 |
4 |
auto(s6) |
f |
19 |
28 |
p |
midsize |
47 |
23.5 |
23.5 |
| 230 |
volkswagen |
passat |
2.0 |
2008 |
4 |
manual(m6) |
f |
21 |
29 |
p |
midsize |
50 |
25.0 |
25.0 |
| 231 |
volkswagen |
passat |
2.8 |
1999 |
6 |
auto(l5) |
f |
16 |
26 |
p |
midsize |
42 |
21.0 |
21.0 |
| 232 |
volkswagen |
passat |
2.8 |
1999 |
6 |
manual(m5) |
f |
18 |
26 |
p |
midsize |
44 |
22.0 |
22.0 |
| 233 |
volkswagen |
passat |
3.6 |
2008 |
6 |
auto(s6) |
f |
17 |
26 |
p |
midsize |
43 |
21.5 |
21.5 |
234 rows × 14 columns
Q3 : ‘평균 연비 변수’가 가장 높은 자동차 3종의 데이터를 출력하세요
- 힌트 : sort_values()와 head()를 조합하면 됩니다.
mpg_new.sort_values('mean', ascending = False).head(3)
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
total |
average |
mean |
| 221 |
volkswagen |
new beetle |
1.9 |
1999 |
4 |
manual(m5) |
f |
35 |
44 |
d |
subcompact |
79 |
39.5 |
39.5 |
| 212 |
volkswagen |
jetta |
1.9 |
1999 |
4 |
manual(m5) |
f |
33 |
44 |
d |
compact |
77 |
38.5 |
38.5 |
| 222 |
volkswagen |
new beetle |
1.9 |
1999 |
4 |
auto(l4) |
f |
29 |
41 |
d |
subcompact |
70 |
35.0 |
35.0 |
Q4 : 1~3번 문제를 해결할 수 있는 하나로 연결된 pandas 구문을 만들어 실행해 보세요. 데이터는 복사본 대신 mpg 원본을 이용하세요
- 힌트 : 앞에서 만든 코드를 연결하면 됩니다. 변수를 추가하는 작업을 하나의 assign()으로 구성하면 코드를 더 간결하게 만들 수 있습니다.
mpg.assign(total = lambda x: x['cty'] + x['hwy'], \
mean = lambda x: x['total'] / 2) \
.sort_values('mean', ascending = False) \
.head(3)
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
total |
mean |
| 221 |
volkswagen |
new beetle |
1.9 |
1999 |
4 |
manual(m5) |
f |
35 |
44 |
d |
subcompact |
79 |
39.5 |
| 212 |
volkswagen |
jetta |
1.9 |
1999 |
4 |
manual(m5) |
f |
33 |
44 |
d |
compact |
77 |
38.5 |
| 222 |
volkswagen |
new beetle |
1.9 |
1999 |
4 |
auto(l4) |
f |
29 |
41 |
d |
subcompact |
70 |
35.0 |
06-6. 집단별로 요약하기(159-166쪽)
[Do it! 실습] 집단별로 요약하기(159쪽)
# exam.csv 불러와서 exam 변수에 저장하라
import pandas as pd
exam = pd.read_csv('exam.csv')
exam.head(3)
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
# agg() 사용해서 수학 성적 평균을 구하고 그값을 변수 mean_math에 할당하라
exam.agg(mean_math = ('math', 'mean')) # 변수에 따옴표 넣지 않음. 함수명 뒤에 () 넣지 않음
# mean() 이용하여 수학 성적 평균을 구하라
exam['math'].mean() # 수학의 전체 평균. # agg()는 groupby()에 적용해 집단별 요약값 구할 때 사용
57.45
집단별 요약 통계량 구하기
# 반별 수학 평균
exam.groupby('nclass') \
.agg(mean_math = ('math', 'mean'))
|
mean_math |
| nclass |
|
| 1 |
46.25 |
| 2 |
61.25 |
| 3 |
45.00 |
| 4 |
56.75 |
| 5 |
78.00 |
# 변수를 인덱스로 바꾸지 않기
exam.groupby('nclass', as_index = False) \
.agg(mean_math = ('math', 'mean'))
|
nclass |
mean_math |
| 0 |
1 |
46.25 |
| 1 |
2 |
61.25 |
| 2 |
3 |
45.00 |
| 3 |
4 |
56.75 |
| 4 |
5 |
78.00 |
여러 요약 통계량 한 번에 구하기
- df.agg()로 여러 요약 통계량을 한 번에 구할 수 있음. =:= df.assign()
exam.groupby('nclass') \
.agg(mean_math = ('math', 'mean'),
sum_math = ('math', 'sum'),
median_math = ('math', 'median'),
n = ('nclass', 'count')) # 빈도(학생 수)
|
mean_math |
sum_math |
median_math |
n |
| nclass |
|
|
|
|
| 1 |
46.25 |
185 |
47.5 |
4 |
| 2 |
61.25 |
245 |
65.0 |
4 |
| 3 |
45.00 |
180 |
47.5 |
4 |
| 4 |
56.75 |
227 |
53.0 |
4 |
| 5 |
78.00 |
312 |
79.0 |
4 |
[Do it! 실습] 집단별로 다시 집단 나누기(163쪽)
- groupby()에 여러 변수를 지정하면, 집단을 나눈 다음 다시 하위 집단으로 나눌 수 있음.
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
# mpg 데이터로, 제조 회사별 집단을 나눈 다음 / 다시 구동 방식별로 나눠 -> 도시 연비 평균을 구하기
# dry의 4년 사륜구동, f는 전륜구동, r은 후륜구동을 의미
mpg = pd.read_csv('mpg.csv')
mpg.groupby(['manufacturer', 'drv']) \
.agg(mean_cty = ('cty', 'mean'))
|
|
mean_cty |
| manufacturer |
drv |
|
| audi |
4 |
16.818182 |
| f |
18.857143 |
| chevrolet |
4 |
12.500000 |
| f |
18.800000 |
| r |
14.100000 |
| dodge |
4 |
12.000000 |
| f |
15.818182 |
| ford |
4 |
13.307692 |
| r |
14.750000 |
| honda |
f |
24.444444 |
| hyundai |
f |
18.642857 |
| jeep |
4 |
13.500000 |
| land rover |
4 |
11.500000 |
| lincoln |
r |
11.333333 |
| mercury |
4 |
13.250000 |
| nissan |
4 |
13.750000 |
| f |
20.000000 |
| pontiac |
f |
17.000000 |
| subaru |
4 |
19.285714 |
| toyota |
4 |
14.933333 |
| f |
21.368421 |
| volkswagen |
f |
20.925926 |
# audi 회사가 생산한 자동차의 구동방식(drv)별 자동차 대수
mpg.query('manufacturer == "audi"') \
.groupby(['drv']) \
.agg(n = ('drv', 'count'))
# chevrolet의 drv별 자동차 생산 대수
mpg.query('manufacturer == "chevrolet"') \
.groupby(['drv']) \
.agg(n = ('drv', 'count'))
[Do it! 실습] pandas 함수 조합하기(165쪽)
Q: suv 합산 연비 평균
-
제조 회사별로 ‘suv’ 자동차의 도시 및 고속도로 합산 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기
-
절차가 복잡해 보이는 분석도 pandas 함수를 조합하면 코드 몇 줄로 간단히 해결할 수 있다.
-
절차
-
- suv 추출 —————– query()
-
- 합산 연비 변수 만들기 —- assign()
-
- 회사별로 분리 ———— groupby()
-
- 합산 연비 평균 구하기 —- agg()
-
- 내림차순 정렬 ———— sort_values()
-
- 1~5위까지 출력 ———– head()
mpg.query('category == "suv"') \
.assign(total = (mpg['cty'] + mpg['hwy']) / 2) \
.groupby(['manufacturer']) \
.agg(mean_tot = ('total', 'mean')) \
.sort_values('mean_tot', ascending = False) \
.head()
|
mean_tot |
| manufacturer |
|
| subaru |
21.916667 |
| toyota |
16.312500 |
| nissan |
15.875000 |
| mercury |
15.625000 |
| jeep |
15.562500 |
[개인 실습] 혼자서 해보기(166쪽)
- mpg 데이터를 이용해 분석 문제를 해결해 보세요
Q1: mpg 데이터의 category는 자동차를 특징에 따라 ‘suv’, ‘compact’ 등 일곱 종류로 분류한 변수입니다. 어떤 차종의 도시 연비가 높은지 비교해 보려고 합니다. category별 cty 평균을 구해 보세요
- 힌트 : groupby()를 이용해 category별로 나눈 다음 agg()를 이용해 cty 평균을 구하면 됩니다.
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
mpg.groupby('category') \
.agg(mean_cty = ('cty', 'mean'))
|
mean_cty |
| category |
|
| 2seater |
15.400000 |
| compact |
20.127660 |
| midsize |
18.756098 |
| minivan |
15.818182 |
| pickup |
13.000000 |
| subcompact |
20.371429 |
| suv |
13.500000 |
Q2: 앞 문제 출력 결과에서, 어떤 차종의 도시 연비가 높은지 쉽게 알아볼 수 있도록, cty 평균이 높은 순으로 정렬해 출력하세요
mpg.groupby('category') \
.agg(mean_cty = ('cty', 'mean')) \
.sort_values('mean_cty', ascending = False)
|
mean_cty |
| category |
|
| subcompact |
20.371429 |
| compact |
20.127660 |
| midsize |
18.756098 |
| minivan |
15.818182 |
| 2seater |
15.400000 |
| suv |
13.500000 |
| pickup |
13.000000 |
Q3: 어떤 회사 자동차의 hwy(고속도로 연비)가 가장 높은지 알아보려 한다. hwy 평균이 가장 높은 회사 세 곳을 출력하라
mpg.groupby('manufacturer') \
.agg(mean_hwy = ('hwy', 'mean')) \
.sort_values('mean_hwy', ascending = False) \
.head(3)
|
mean_hwy |
| manufacturer |
|
| honda |
32.555556 |
| volkswagen |
29.222222 |
| hyundai |
26.857143 |
Q4: 어떤 회사에서 ‘compact’ 차종을 가장 많이 생산하는지 알아보려 한다. 회사별 ‘compact’ 차종 수를 내림차순으로 정렬해 출력하라
mpg.query('category == "compact"') \
.groupby('manufacturer') \
.agg(n = ('manufacturer', 'count')) \
.sort_values('n', ascending = False)
|
n |
| manufacturer |
|
| audi |
15 |
| volkswagen |
14 |
| toyota |
12 |
| subaru |
4 |
| nissan |
2 |
06-7. 데이터 합치기(167-172쪽)
[Do it! 실습] 가로로 합치기(168쪽)
# 중간고사 데이터 만들기
test1 = pd.DataFrame({'id' : [1, 2, 3, 4, 5],
'medterm' : [60, 80, 70, 90, 85]})
# 기말고사 데이터 만들기
test2 = pd.DataFrame({'id' : [1, 2, 3, 4, 5],
'final' : [70, 83, 65, 95, 80]})
|
id |
medterm |
| 0 |
1 |
60 |
| 1 |
2 |
80 |
| 2 |
3 |
70 |
| 3 |
4 |
90 |
| 4 |
5 |
85 |
|
id |
final |
| 0 |
1 |
70 |
| 1 |
2 |
83 |
| 2 |
3 |
65 |
| 3 |
4 |
95 |
| 4 |
5 |
80 |
# id 기준으로 합쳐서 total에 할당
total = pd.merge(test1, test2, how = 'left', on = 'id')
total
|
id |
medterm |
final |
| 0 |
1 |
60 |
70 |
| 1 |
2 |
80 |
83 |
| 2 |
3 |
70 |
65 |
| 3 |
4 |
90 |
95 |
| 4 |
5 |
85 |
80 |
# 다른 데이터를 활용해 변수 추가하기
## 'exam.csv' 불러와서 변수 exam에 저장하기
exam = pd.read_csv('exam.csv')
exam
|
id |
nclass |
math |
english |
science |
| 0 |
1 |
1 |
50 |
98 |
50 |
| 1 |
2 |
1 |
60 |
97 |
60 |
| 2 |
3 |
1 |
45 |
86 |
78 |
| 3 |
4 |
1 |
30 |
98 |
58 |
| 4 |
5 |
2 |
25 |
80 |
65 |
| 5 |
6 |
2 |
50 |
89 |
98 |
| 6 |
7 |
2 |
80 |
90 |
45 |
| 7 |
8 |
2 |
90 |
78 |
25 |
| 8 |
9 |
3 |
20 |
98 |
15 |
| 9 |
10 |
3 |
50 |
98 |
45 |
| 10 |
11 |
3 |
65 |
65 |
65 |
| 11 |
12 |
3 |
45 |
85 |
32 |
| 12 |
13 |
4 |
46 |
98 |
65 |
| 13 |
14 |
4 |
48 |
87 |
12 |
| 14 |
15 |
4 |
75 |
56 |
78 |
| 15 |
16 |
4 |
58 |
98 |
65 |
| 16 |
17 |
5 |
65 |
68 |
98 |
| 17 |
18 |
5 |
80 |
78 |
90 |
| 18 |
19 |
5 |
89 |
68 |
87 |
| 19 |
20 |
5 |
78 |
83 |
58 |
# 새 데이터 프레임 생성해서 변수 name에 저장
name = pd.DataFrame({'nclass' : [1, 2, 3, 4, 5],
'teacher' : ['kim', 'lee', 'park', 'choi', 'jung']})
name
|
nclass |
teacher |
| 0 |
1 |
kim |
| 1 |
2 |
lee |
| 2 |
3 |
park |
| 3 |
4 |
choi |
| 4 |
5 |
jung |
# 반별 담임교사 명단을 반영한 시험 데이터
exam_new = pd.merge(exam, name, how = 'left', on = 'nclass')
exam_new
|
id |
nclass |
math |
english |
science |
teacher |
| 0 |
1 |
1 |
50 |
98 |
50 |
kim |
| 1 |
2 |
1 |
60 |
97 |
60 |
kim |
| 2 |
3 |
1 |
45 |
86 |
78 |
kim |
| 3 |
4 |
1 |
30 |
98 |
58 |
kim |
| 4 |
5 |
2 |
25 |
80 |
65 |
lee |
| 5 |
6 |
2 |
50 |
89 |
98 |
lee |
| 6 |
7 |
2 |
80 |
90 |
45 |
lee |
| 7 |
8 |
2 |
90 |
78 |
25 |
lee |
| 8 |
9 |
3 |
20 |
98 |
15 |
park |
| 9 |
10 |
3 |
50 |
98 |
45 |
park |
| 10 |
11 |
3 |
65 |
65 |
65 |
park |
| 11 |
12 |
3 |
45 |
85 |
32 |
park |
| 12 |
13 |
4 |
46 |
98 |
65 |
choi |
| 13 |
14 |
4 |
48 |
87 |
12 |
choi |
| 14 |
15 |
4 |
75 |
56 |
78 |
choi |
| 15 |
16 |
4 |
58 |
98 |
65 |
choi |
| 16 |
17 |
5 |
65 |
68 |
98 |
jung |
| 17 |
18 |
5 |
80 |
78 |
90 |
jung |
| 18 |
19 |
5 |
89 |
68 |
87 |
jung |
| 19 |
20 |
5 |
78 |
83 |
58 |
jung |
[Do it! 실습] 세로로 합치기(170쪽)
# 학생 1-5반 시험 데이터 만들기
group_a = pd.DataFrame({'id' : [1, 2, 3, 4, 5],
'test' : [60, 80, 70, 90, 85]})
# 학생 6-10번 시험 데이터 만들기
group_b = pd.DataFrame({'id' : [6, 7, 8, 9, 10],
'test' : [70, 83, 65, 95, 80]})
|
id |
test |
| 0 |
1 |
60 |
| 1 |
2 |
80 |
| 2 |
3 |
70 |
| 3 |
4 |
90 |
| 4 |
5 |
85 |
|
id |
test |
| 0 |
6 |
70 |
| 1 |
7 |
83 |
| 2 |
8 |
65 |
| 3 |
9 |
95 |
| 4 |
10 |
80 |
# group_a, group_b를 세로로 합해서 이를 group_all에 저장하라
group_all = pd.concat([group_a, group_b])
group_all
|
id |
test |
| 0 |
1 |
60 |
| 1 |
2 |
80 |
| 2 |
3 |
70 |
| 3 |
4 |
90 |
| 4 |
5 |
85 |
| 0 |
6 |
70 |
| 1 |
7 |
83 |
| 2 |
8 |
65 |
| 3 |
9 |
95 |
| 4 |
10 |
80 |
# 앞의 결과에서 인덱스 번호를 일련번호로 새로 지정하라
group_all = pd.concat([group_a, group_b], ignore_index = True)
group_all
|
id |
test |
| 0 |
1 |
60 |
| 1 |
2 |
80 |
| 2 |
3 |
70 |
| 3 |
4 |
90 |
| 4 |
5 |
85 |
| 5 |
6 |
70 |
| 6 |
7 |
83 |
| 7 |
8 |
65 |
| 8 |
9 |
95 |
| 9 |
10 |
80 |
[개인 실습] 혼자서 해보기(173쪽)
- mpg 데이터를 이용해 분석 문제를 해결하시오
|
manufacturer |
model |
displ |
year |
cyl |
trans |
drv |
cty |
hwy |
fl |
category |
| 0 |
audi |
a4 |
1.8 |
1999 |
4 |
auto(l5) |
f |
18 |
29 |
p |
compact |
| 1 |
audi |
a4 |
1.8 |
1999 |
4 |
manual(m5) |
f |
21 |
29 |
p |
compact |
| 2 |
audi |
a4 |
2.0 |
2008 |
4 |
manual(m6) |
f |
20 |
31 |
p |
compact |
# 새로운 데이터 프레임 생성: 자동차 연료별 가격
fuel = pd.DataFrame({'fl' : ['c', 'd', 'e', 'p', 'r'],
'price_fl' : [2.35, 2.38, 2.11, 2.76, 2.22]})
fuel
|
fl |
price_fl |
| 0 |
c |
2.35 |
| 1 |
d |
2.38 |
| 2 |
e |
2.11 |
| 3 |
p |
2.76 |
| 4 |
r |
2.22 |
Q1: fuel 데이터를 이용해 mpg 데이터에 price_fl(연료가격) 변수를 추가하라
mpg = pd.merge(mpg, fuel, on = 'fl', how = 'left')
Q2: 연료 가격 변수가 잘 추가됐는지 확인하기 위해 model, fl, price_fl 변수를 추출해 앞부분 5행을 출력하라
mpg = pd.merge(mpg, fuel, on = 'fl', how = 'left')
mpg[['model', 'fl', 'price_fl']].head()
|
model |
fl |
price_fl |
| 0 |
a4 |
p |
2.76 |
| 1 |
a4 |
p |
2.76 |
| 2 |
a4 |
p |
2.76 |
| 3 |
a4 |
p |
2.76 |
| 4 |
a4 |
p |
2.76 |
[분석 도전]
- 미국 동북중부 437개 지역 인구통계 정보를 담고 있는 midwest.csv를 사용해 데이터 분석 문제를 해결하라
midwest = pd.read_csv('midwest.csv')
midwest
|
PID |
county |
state |
area |
poptotal |
popdensity |
popwhite |
popblack |
popamerindian |
popasian |
... |
percollege |
percprof |
poppovertyknown |
percpovertyknown |
percbelowpoverty |
percchildbelowpovert |
percadultpoverty |
percelderlypoverty |
inmetro |
category |
| 0 |
561 |
ADAMS |
IL |
0.052 |
66090 |
1270.961540 |
63917 |
1702 |
98 |
249 |
... |
19.631392 |
4.355859 |
63628 |
96.274777 |
13.151443 |
18.011717 |
11.009776 |
12.443812 |
0 |
AAR |
| 1 |
562 |
ALEXANDER |
IL |
0.014 |
10626 |
759.000000 |
7054 |
3496 |
19 |
48 |
... |
11.243308 |
2.870315 |
10529 |
99.087145 |
32.244278 |
45.826514 |
27.385647 |
25.228976 |
0 |
LHR |
| 2 |
563 |
BOND |
IL |
0.022 |
14991 |
681.409091 |
14477 |
429 |
35 |
16 |
... |
17.033819 |
4.488572 |
14235 |
94.956974 |
12.068844 |
14.036061 |
10.852090 |
12.697410 |
0 |
AAR |
| 3 |
564 |
BOONE |
IL |
0.017 |
30806 |
1812.117650 |
29344 |
127 |
46 |
150 |
... |
17.278954 |
4.197800 |
30337 |
98.477569 |
7.209019 |
11.179536 |
5.536013 |
6.217047 |
1 |
ALU |
| 4 |
565 |
BROWN |
IL |
0.018 |
5836 |
324.222222 |
5264 |
547 |
14 |
5 |
... |
14.475999 |
3.367680 |
4815 |
82.505140 |
13.520249 |
13.022889 |
11.143211 |
19.200000 |
0 |
AAR |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 432 |
3048 |
WAUKESHA |
WI |
0.034 |
304715 |
8962.205880 |
298313 |
1096 |
672 |
2699 |
... |
35.396784 |
7.667090 |
299802 |
98.387674 |
3.121060 |
3.785820 |
2.590061 |
4.085479 |
1 |
HLU |
| 433 |
3049 |
WAUPACA |
WI |
0.045 |
46104 |
1024.533330 |
45695 |
22 |
125 |
92 |
... |
16.549869 |
3.138596 |
44412 |
96.330036 |
8.488697 |
10.071411 |
6.953799 |
10.338641 |
0 |
AAR |
| 434 |
3050 |
WAUSHARA |
WI |
0.037 |
19385 |
523.918919 |
19094 |
29 |
70 |
43 |
... |
15.064584 |
2.620907 |
19163 |
98.854785 |
13.786985 |
20.050708 |
11.695784 |
11.804558 |
0 |
AAR |
| 435 |
3051 |
WINNEBAGO |
WI |
0.035 |
140320 |
4009.142860 |
136822 |
697 |
685 |
1728 |
... |
24.995504 |
5.659847 |
133950 |
95.460376 |
8.804031 |
10.592031 |
8.660587 |
6.661094 |
1 |
HAU |
| 436 |
3052 |
WOOD |
WI |
0.048 |
73605 |
1533.437500 |
72157 |
90 |
481 |
722 |
... |
21.666382 |
4.583725 |
72685 |
98.750085 |
8.525831 |
11.162997 |
7.375656 |
7.882918 |
0 |
AAR |
437 rows × 28 columns
# 문제 1: popadults는 해당 지역의 성인 인구, poptotal은 전체 인구를 나태닌다. midwest 데이터에 '전체 인구 대비 미성년 인구 백분율' 변수를 추가하라
midwest_new = midwest.assign(ratio = 100 - (midwest['popadults'] / midwest['poptotal']) * 100)
midwest_new.head(3)
|
PID |
county |
state |
area |
poptotal |
popdensity |
popwhite |
popblack |
popamerindian |
popasian |
... |
percprof |
poppovertyknown |
percpovertyknown |
percbelowpoverty |
percchildbelowpovert |
percadultpoverty |
percelderlypoverty |
inmetro |
category |
ratio |
| 0 |
561 |
ADAMS |
IL |
0.052 |
66090 |
1270.961540 |
63917 |
1702 |
98 |
249 |
... |
4.355859 |
63628 |
96.274777 |
13.151443 |
18.011717 |
11.009776 |
12.443812 |
0 |
AAR |
34.486307 |
| 1 |
562 |
ALEXANDER |
IL |
0.014 |
10626 |
759.000000 |
7054 |
3496 |
19 |
48 |
... |
2.870315 |
10529 |
99.087145 |
32.244278 |
45.826514 |
27.385647 |
25.228976 |
0 |
LHR |
36.721250 |
| 2 |
563 |
BOND |
IL |
0.022 |
14991 |
681.409091 |
14477 |
429 |
35 |
16 |
... |
4.488572 |
14235 |
94.956974 |
12.068844 |
14.036061 |
10.852090 |
12.697410 |
0 |
AAR |
35.501301 |
3 rows × 29 columns
# 문제 2: 미성년 인구 백분율을 변수 ratio에 넣고, 이 백분율이 가장 높은 상위 5개 county(지역)의 미성년 인구 백분율을 출력하라
midwest_new.sort_values('ratio', ascending = False) \
.head() \
[['county', 'ratio']]
|
county |
ratio |
| 230 |
ISABELLA |
51.501172 |
| 404 |
MENOMINEE |
50.591260 |
| 281 |
ATHENS |
49.320727 |
| 247 |
MECOSTA |
49.059183 |
| 154 |
MONROE |
47.358182 |
# 문제 3: 분류표 기준에 따라 미성년 비율 등급 변수를 추가하고, 각 등급에 몇 개의 지역이 있는지 알아보라
## 분류표 데이터 생성
class_table = pd.DataFrame({'분류' : ['large', 'middle', 'small'],
'기준' : ['40% 이상', '30~40% 이상', '30% 이상']})
class_table
|
분류 |
기준 |
| 0 |
large |
40% 이상 |
| 1 |
middle |
30~40% 이상 |
| 2 |
small |
30% 이상 |
# 미성년 비율 등급을 변수 grade에 추가
import numpy as np
midwest_new['grade'] = np.where(midwest_new['ratio'] >= 40, 'large',
np.where(midwest_new['ratio'] >= 30, 'middle', 'small'))
midwest_new.head(3)
|
PID |
county |
state |
area |
poptotal |
popdensity |
popwhite |
popblack |
popamerindian |
popasian |
... |
poppovertyknown |
percpovertyknown |
percbelowpoverty |
percchildbelowpovert |
percadultpoverty |
percelderlypoverty |
inmetro |
category |
ratio |
grade |
| 0 |
561 |
ADAMS |
IL |
0.052 |
66090 |
1270.961540 |
63917 |
1702 |
98 |
249 |
... |
63628 |
96.274777 |
13.151443 |
18.011717 |
11.009776 |
12.443812 |
0 |
AAR |
34.486307 |
middle |
| 1 |
562 |
ALEXANDER |
IL |
0.014 |
10626 |
759.000000 |
7054 |
3496 |
19 |
48 |
... |
10529 |
99.087145 |
32.244278 |
45.826514 |
27.385647 |
25.228976 |
0 |
LHR |
36.721250 |
middle |
| 2 |
563 |
BOND |
IL |
0.022 |
14991 |
681.409091 |
14477 |
429 |
35 |
16 |
... |
14235 |
94.956974 |
12.068844 |
14.036061 |
10.852090 |
12.697410 |
0 |
AAR |
35.501301 |
middle |
3 rows × 30 columns
# 각 등급별 지역 수 파악
midwest_new.groupby('grade') \
.agg(n = ('grade', 'count'))
|
n |
| grade |
|
| large |
32 |
| middle |
396 |
| small |
9 |
# 문제 4: popasian은 해당 지역의 아시아인 인구를 나타낸다.
# '전체 인구 대비 아시아인 인구 백분율' 변수를 추가하고,
# 하위 10개 지역의 state(주), county(지역), 아시아인 인구 백분율을 출력하라
# 아시아인 인구 백분율 변수는 ratio_asian으로 사용하라
midwest.assign(ratio_asian = midwest['popasian'] / midwest['poptotal'] * 100) \
.sort_values('ratio_asian') \
.head(10) \
[['state', 'county', 'ratio_asian']]
|
state |
county |
ratio_asian |
| 404 |
WI |
MENOMINEE |
0.000000 |
| 105 |
IN |
BENTON |
0.010592 |
| 109 |
IN |
CARROLL |
0.015950 |
| 358 |
OH |
VINTON |
0.027032 |
| 390 |
WI |
IRON |
0.032504 |
| 85 |
IL |
SCOTT |
0.053154 |
| 112 |
IN |
CLAY |
0.060716 |
| 261 |
MI |
OSCODA |
0.063759 |
| 340 |
OH |
PERRY |
0.066546 |
| 73 |
IL |
PIATT |
0.070749 |
The End of Notebook
댓글남기기