42 분 소요

3강. 자유자재의 데이터 가공

  • 둘째마당 (06)

  • pp.131-176 (46쪽)

06-1. 데이터 전처리 - 원하는 형태로 데이터 가공하기(132쪽)

  • 데이터 전처리 : 분석에 적합하게 데이터를 가공하는 작업

  • 추출, 종류별 분류, 데이터 합치기 등

  • 판다스(pandas) : 전처리에 가장 많이 사용되는 패키지

주요 함수들

  • 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쪽)

  • 1반과 2반을 추출해 각각 새 데이터로 만든 다음,

  • 두 반의 수학 점수 평균을 구하기

# 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"')
sex country
0 F Korea
# 반대로 전체 조건을 큰따옴표로 감쌌다면 추출할 문자는 작은따옴표로 감싸야 함: 남성 & 중국
df.query("sex == 'M' & country == 'China'")
sex country
1 M 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(도시 연비) 평균이 더 높은지 알아보세요
mpg[: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, 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쪽)

  • 1) 명령어 끝난 부분 뒤에 백슬래서()를 입력하고 Enter를 눌러 줄을 바꿈

  • 2) Spacebar를 Tab을 이용해 간격을 띄우고 다음 명령어를 입력

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쪽)

  • df.sort_values()

[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쪽)

  • mpg 데이터 이용하여 분석 문제 해결

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쪽)

  • 파생변수 : 변수를 조합하거나 함수를 이용해서 만든 “새 변수”

  • df.assign( ) 이용

[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쪽)

  • ‘집단별 평균’, ‘집단별 빈도’처럼 각 집단을 요약한 값을 구할 때 -> df.groupby()와 df.agg()를 사용

  • 집단 간에 어떤 차이가 있는지 쉽게 파악 가능

[Do it! 실습] 집단별로 요약하기(159쪽)

  • 전체 요약 통계량 구하기 : df.agg() 사용

    • df.agg()에 mean_math = (‘math’, ‘mean’)처럼 요약값 할당한 변수명과 =를 입력한 다음,

    • 값을 요약하는데 사용할 변수와 함수를 괄호 안에 나열

# 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')) # 변수에 따옴표 넣지 않음. 함수명 뒤에 () 넣지 않음
math
mean_math 57.45
# mean() 이용하여 수학 성적 평균을 구하라
exam['math'].mean()  # 수학의 전체 평균. # agg()는 groupby()에 적용해 집단별 요약값 구할 때 사용
57.45

집단별 요약 통계량 구하기

  • df.groupby()에 변수를 지정하면 변수의 범주별로 데이터를 분리

  • 여기에 agg()를 적용하면, 집단별 요약 통계량이 나옴.

# 반별 수학 평균
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()에 여러 변수를 지정하면, 집단을 나눈 다음 다시 하위 집단으로 나눌 수 있음.
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
# 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'))
n
drv
4 11
f 7
# chevrolet의 drv별 자동차 생산 대수

mpg.query('manufacturer == "chevrolet"') \
   .groupby(['drv']) \
   .agg(n = ('drv', 'count'))
n
drv
4 4
f 5
r 10

[Do it! 실습] pandas 함수 조합하기(165쪽)

Q: suv 합산 연비 평균

  • 제조 회사별로 ‘suv’ 자동차의 도시 및 고속도로 합산 연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기

  • 절차가 복잡해 보이는 분석도 pandas 함수를 조합하면 코드 몇 줄로 간단히 해결할 수 있다.

  • 절차

      1. suv 추출 —————– query()
      1. 합산 연비 변수 만들기 —- assign()
      1. 회사별로 분리 ———— groupby()
      1. 합산 연비 평균 구하기 —- agg()
      1. 내림차순 정렬 ———— sort_values()
      1. 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 평균을 구하면 됩니다.
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
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]})
test1
id medterm
0 1 60
1 2 80
2 3 70
3 4 90
4 5 85
test2
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]})
group_a
id test
0 1 60
1 2 80
2 3 70
3 4 90
4 5 85
group_b
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 데이터를 이용해 분석 문제를 해결하시오
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
# 새로운 데이터 프레임 생성: 자동차 연료별 가격

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

업데이트:

댓글남기기