# 1. delivery.csv 파일을 읽고
deli = pd.read_csv('delivery.csv', encoding='cp949')
deli.head()
deli.head()
Out[352]:
일자 시간대 업종 시도 시군구 읍면동 통화건수
0 20180201 0 음식점-족발/보쌈전문 서울특별시 강남구 논현동 5
1 20180201 0 음식점-족발/보쌈전문 서울특별시 강남구 역삼동 5
2 20180201 0 음식점-족발/보쌈전문 서울특별시 강서구 내발산동 5
3 20180201 0 음식점-족발/보쌈전문 서울특별시 강서구 화곡동 5
4 20180201 0 음식점-족발/보쌈전문 서울특별시 동작구 신대방동 5
# 1) 일자별 통화건수 총 합
[ 내 답변 ]
deli.groupby('일자')['통화건수'].sum()
deli.groupby('일자')['통화건수'].sum()
Out[353]:
일자
20180201 39653
20180202 46081
20180203 54124
20180204 50323
20180205 35023
20180206 38628
20180207 39371
20180208 40153
20180209 49116
20180210 54101
20180211 50795
20180212 36734
20180213 43097
20180214 45282
20180215 28201
20180216 16570
20180217 34789
20180218 43692
20180219 34259
20180220 38036
20180221 39381
20180222 42309
20180223 50270
20180224 53415
20180225 51286
20180226 36141
20180227 38783
20180228 52323
Name: 통화건수, dtype: int64
[ 문제풀이 ]
deli.groupby('일자', as_index = False)['통화건수'].sum()
deli.groupby('일자', as_index = False)['통화건수'].sum()
Out[11]:
일자 통화건수
0 20180201 39653
1 20180202 46081
2 20180203 54124
3 20180204 50323
4 20180205 35023
5 20180206 38628
6 20180207 39371
7 20180208 40153
8 20180209 49116
9 20180210 54101
10 20180211 50795
11 20180212 36734
12 20180213 43097
13 20180214 45282
14 20180215 28201
15 20180216 16570
16 20180217 34789
17 20180218 43692
18 20180219 34259
19 20180220 38036
20 20180221 39381
21 20180222 42309
22 20180223 50270
23 20180224 53415
24 20180225 51286
25 20180226 36141
26 20180227 38783
27 20180228 52323
# 2) 시도별 시군구별 통화건수 총합
[ 내 답변 ]
deli.groupby('시군구')['통화건수'].sum()
deli.groupby('시군구')['통화건수'].sum()
Out[354]:
시군구
강남구 94598
강동구 50951
강북구 59290
강서구 102926
관악구 14713
광진구 14784
구로구 31730
금천구 19702
노원구 51615
도봉구 9497
동대문구 44931
동작구 76491
마포구 40206
서대문구 63240
서초구 65928
성동구 52677
성북구 45446
송파구 59997
양천구 15846
영등포구 61204
용산구 46040
은평구 38425
종로구 23010
중구 59952
중랑구 38737
[ 문제풀이 ]
deli.groupby(['시도','시군구'], as_index = False)['통화건수'].sum()
deli.groupby(['시도','시군구'], as_index = False)['통화건수'].sum()
Out[15]:
시도 시군구 통화건수
0 서울특별시 강남구 94598
1 서울특별시 강동구 50951
2 서울특별시 강북구 59290
3 서울특별시 강서구 102926
4 서울특별시 관악구 14713
5 서울특별시 광진구 14784
6 서울특별시 구로구 31730
7 서울특별시 금천구 19702
8 서울특별시 노원구 51615
9 서울특별시 도봉구 9497
10 서울특별시 동대문구 44931
11 서울특별시 동작구 76491
12 서울특별시 마포구 40206
13 서울특별시 서대문구 63240
14 서울특별시 서초구 65928
15 서울특별시 성동구 52677
16 서울특별시 성북구 45446
17 서울특별시 송파구 59997
18 서울특별시 양천구 15846
19 서울특별시 영등포구 61204
20 서울특별시 용산구 46040
21 서울특별시 은평구 38425
22 서울특별시 종로구 23010
23 서울특별시 중구 59952
24 서울특별시 중랑구 38737
# 3) 시간대별 통화건수가 가장 많은 음식업종
[ 내 답변 ]
max_call = deli.groupby('시간대')['통화건수'].transform('max')
deli.loc[deli['통화건수'] == max_call, ['시간대', '업종', '통화건수']]
deli.loc[deli['통화건수'] == max_call, ['시간대', '업종', '통화건수']]
Out[380]:
시간대 업종 통화건수
425 9 음식점-중국음식 14
515 10 음식점-중국음식 41
9010 1 치킨 14
10148 13 음식점-중국음식 148
10456 14 음식점-중국음식 102
10751 15 음식점-중국음식 64
13835 1 치킨 14
16253 17 치킨 175
22619 10 음식점-중국음식 41
39253 22 치킨 200
39892 4 음식점-중국음식 15
39921 5 음식점-중국음식 11
43751 21 치킨 189
46594 16 치킨 101
46960 17 치킨 175
47327 18 치킨 229
53666 11 음식점-중국음식 118
62290 7 음식점-중국음식 9
62296 7 음식점-중국음식 9
62312 8 음식점-중국음식 10
79738 6 음식점-족발/보쌈전문 10
97066 2 음식점-중국음식 12
97115 3 음식점-중국음식 13
97834 12 음식점-중국음식 168
100243 19 치킨 229
101687 0 치킨 44
118195 20 치킨 227
119044 23 치킨 106
[ 문제풀이 ]
# 문제풀이
1) 기초데이터 생성
deli2 = deli.groupby(['시간대','업종'], as_index = False)['통화건수'].sum()
2) groupby + merge
deli_max = deli2.groupby('시간대', as_index = False)['통화건수'].max()
pd.merge(deli2, deli_max)
3) transform
deli2['최대통화건수'] = deli2.groupby('시간대')['통화건수'].transform('max')
deli2.loc[deli2['통화건수'] == deli2['최대통화건수'], :]
pd.merge(deli2, deli_max)
Out[18]:
시간대 업종 통화건수
0 0 치킨 10750
1 1 치킨 4859
2 2 음식점-중국음식 2908
3 3 음식점-중국음식 2490
4 4 음식점-중국음식 2175
5 5 음식점-중국음식 1766
6 6 음식점-중국음식 1540
7 7 음식점-중국음식 1621
8 8 음식점-중국음식 2412
9 9 음식점-중국음식 5791
10 10 음식점-중국음식 15791
11 11 음식점-중국음식 46551
12 12 음식점-중국음식 61238
13 13 음식점-중국음식 46899
14 14 음식점-중국음식 31485
15 15 음식점-중국음식 24585
16 16 음식점-중국음식 24072
17 17 치킨 39604
18 18 치킨 68044
19 19 치킨 71904
20 20 치킨 60824
21 21 치킨 55213
22 22 치킨 47807
23 23 치킨 28257
# 2. 'test3.txt' 파일을 읽고
df1 = pd.read_csv('test3.txt', sep='\t', header=None)
# 1) 다음과 같은 데이터 프레임 형태로 변경
# 20대 30대 40대 50대 60세이상
# 2000년 7.5 3.6 3.5 3.3 1.5
# 2001년 7.4 3.2 3.0 2.8 1.2
# 2002년 6.6 2.9 2.0 2.0 1.1
# ....................................
# 2011년 7.4 3.4 2.1 2.1 2.7
# 2012년 7.5 3.0 2.1 2.1 2.5
# 2013년 7.9 3.0 2.0 1.9 1.9
[ 내 답변 ]
df1.columns = ['20대','30대','40대','50대','60대 이상']
year = [str(i) + '년' for i in range(2000, 2014)]
df1.index = year
df1
Out[391]:
20대 30대 40대 50대 60대 이상
2000년 7.5 3.6 3.5 3.3 1.5
2001년 7.4 3.2 3.0 2.8 1.2
2002년 6.6 2.9 2.0 2.0 1.1
2003년 7.7 3.0 2.2 2.2 1.0
2004년 7.9 3.1 2.3 2.3 1.2
2005년 7.7 3.3 2.6 2.5 1.3
2006년 7.7 3.0 2.3 2.2 1.4
2007년 7.1 3.2 2.0 2.1 1.4
2008년 7.0 3.1 2.1 2.0 1.2
2009년 7.9 3.6 2.5 2.5 1.6
2010년 7.8 3.5 2.5 2.4 3.0
2011년 7.4 3.4 2.1 2.1 2.7
2012년 7.5 3.0 2.1 2.1 2.5
2013년 7.9 3.0 2.0 1.9 1.9
[ 문제풀이 ]
from pandas import Series, DataFrame
# 컬럼 이름 변경)
# 문자열 결합의 경우 에러가 발생한다.
a1 = Series(range(20,61,10)) + '대'
# 따라서 .astype(str)을 통해 문자열로 변환을 진행한다.
a1 = Series(range(20,61,10)).astype(str) + '대'
a1.iloc[-1] = '60세 이상'
df1.columns = a1
# 컬럼 이름 변경)
# 문자열 결합의 경우 에러가 발생한다.
a1 = Series(range(20,61,10)) + '대'
# 따라서 .astype(str)을 통해 문자열로 변환을 진행한다.
a1 = Series(range(20,61,10)).astype(str) + '대'
a1.iloc[-1] = '60세 이상'
df1.columns = a1
# index 변경)
a2 = Series(range(2000,2014)).astype(str) + '년'
# 또는
s1 = Series(range(2000,2014))
# 원소별 fetch이기 때문에 오류가 발생한다. (astype은 Series에 적용된다.)
s1.map(lambda x : x.astype(str))
# 따라서 다음과 같이 작성한다.
df1.index = s1.map(lambda x : str(x) + '년')
df1
Out[54]:
20대 30대 40대 50대 60세 이상
2000년 7.5 3.6 3.5 3.3 1.5
2001년 7.4 3.2 3.0 2.8 1.2
2002년 6.6 2.9 2.0 2.0 1.1
2003년 7.7 3.0 2.2 2.2 1.0
2004년 7.9 3.1 2.3 2.3 1.2
2005년 7.7 3.3 2.6 2.5 1.3
2006년 7.7 3.0 2.3 2.2 1.4
2007년 7.1 3.2 2.0 2.1 1.4
2008년 7.0 3.1 2.1 2.0 1.2
2009년 7.9 3.6 2.5 2.5 1.6
2010년 7.8 3.5 2.5 2.4 3.0
2011년 7.4 3.4 2.1 2.1 2.7
2012년 7.5 3.0 2.1 2.1 2.5
2013년 7.9 3.0 2.0 1.9 1.9
# 2) 2010년부터의 20~40대 실업률력만 추출하여 df2에 저장
[ 내 답안 ]
df2 = df1.loc[list(df1.index)[10:15], ['20대','30대','40대']]
df2
Out[422]:
20대 30대 40대
2010년 7.8 3.5 2.5
2011년 7.4 3.4 2.1
2012년 7.5 3.0 2.1
2013년 7.9 3.0 2.0
[ 문제풀이 ]
df2 = df1.loc['2010년':, '20대':'40대']
df2
Out[56]:
20대 30대 40대
2010년 7.8 3.5 2.5
2011년 7.4 3.4 2.1
2012년 7.5 3.0 2.1
2013년 7.9 3.0 2.0
# 3) 30대 실업률을 추출하되, 소수점 둘째자리의 표현식으로 출력(기존 데이터에 수정X)
[ 내 답안 ]
df1['30대']
f1 = lambda x : '%.2f' % x
df1['30대'].map(f1)
df1['30대'].map(f1)
Out[399]:
2000년 3.60
2001년 3.20
2002년 2.90
2003년 3.00
2004년 3.10
2005년 3.30
2006년 3.00
2007년 3.20
2008년 3.10
2009년 3.60
2010년 3.50
2011년 3.40
2012년 3.00
2013년 3.00
Name: 30대, dtype: object
[ 문제풀이 ]
'%.2f' % df1['30대'] # 불가
'%.2f' % df1['30대'][0] # 불가
'%.2f' % df1.loc['2010년', '30대']
'%.2f' % df1.loc['2010년', '30대']
Out[63]: '3.50'
df1['30대'].map(lambda x : '%.2f' % x)
df1['30대'].map(lambda x : '%.2f' % x)
Out[64]:
2000년 3.60
2001년 3.20
2002년 2.90
2003년 3.00
2004년 3.10
2005년 3.30
2006년 3.00
2007년 3.20
2008년 3.10
2009년 3.60
2010년 3.50
2011년 3.40
2012년 3.00
2013년 3.00
Name: 30대, dtype: object
# 4) 연도별/연령대별 각각 실업률 평균
[ 내 답안 ]
df1.iloc[:, 1:].mean(axis=1)
df1.iloc[:, 1:].mean(axis=1)
Out[442]:
2000년 2.975
2001년 2.550
2002년 2.000
2003년 2.100
2004년 2.225
2005년 2.425
2006년 2.225
2007년 2.175
2008년 2.100
2009년 2.550
2010년 2.850
2011년 2.575
2012년 2.425
2013년 2.200
dtype: float64
df1.iloc[:, 1:].mean(axis=0)
df1.iloc[:, 1:].mean(axis=0)
Out[443]:
30대 3.207143
40대 2.371429
50대 2.314286
60대 이상 1.642857
dtype: float64
[ 문제풀이 ]
df1.mean(axis=0)
df1.mean(axis=1)
df1.mean(axis=0)
Out[65]:
20대 7.507143
30대 3.207143
40대 2.371429
50대 2.314286
60세 이상 1.642857
dtype: float64
df1.mean(axis=1)
Out[66]:
2000년 3.88
2001년 3.52
2002년 2.92
2003년 3.22
2004년 3.36
2005년 3.48
2006년 3.32
2007년 3.16
2008년 3.08
2009년 3.62
2010년 3.84
2011년 3.54
2012년 3.44
2013년 3.34
dtype: float64
df1.apply('mean', axis = 0)
df1.apply('mean', axis = 1)
df1.apply('mean', axis = 0)
Out[67]:
20대 7.507143
30대 3.207143
40대 2.371429
50대 2.314286
60세 이상 1.642857
dtype: float64
df1.apply('mean', axis = 1)
Out[68]:
2000년 3.88
2001년 3.52
2002년 2.92
2003년 3.22
2004년 3.36
2005년 3.48
2006년 3.32
2007년 3.16
2008년 3.08
2009년 3.62
2010년 3.84
2011년 3.54
2012년 3.44
2013년 3.34
dtype: float64
'아이티윌_데이터 분석 55기 > 문제풀이_Python' 카테고리의 다른 글
| #7-2. 7일차 퀴즈에 대한 문제풀이 (0) | 2026.05.20 |
|---|---|
| #6-2. 6일차 퀴즈에 대한 문제풀이 (0) | 2026.05.18 |
| #3-2. 3일차 퀴즈에 대한 문제풀이 (+ 다양한 print 방법) (0) | 2026.05.13 |
| #2-2. 2일차 퀴즈에 대한 문제풀이 (0) | 2026.05.12 |
| #1-2. 1일차 퀴즈에 대한 문제풀이 (0) | 2026.05.11 |