#ABC부트캠프 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업 #인공지능 #파이썬 #머신러닝 #딥러닝
오늘은 4일간의 파이썬 기초를 끝내고 데이터 처리를 위한 판다스(Pandas)와 데이터 전처리 기초를 배워 보았습니다.
판다스의 기초부터 설명하고 전처리에서 사용하는 방법을 알려드리도록 하겠습니다.

먼저 판다스란 무엇일까요?
판다스(Pandas)는 파이썬에서 데이터 조작과 분석을 위한 강력한 오픈 소스 라이브러리입니다. 판다스는 다양한 데이터 구조와 조작 도구를 제공하여, 구조화된 데이터를 효율적으로 처리하고 분석하는 데 매우 유용합니다.
주요 기능
- 데이터 구조
- Series: 일차원 배열과 같은 데이터 구조로, 인덱스를 갖는 데이터의 집합입니다.
- DataFrame: 이차원 배열과 같은 데이터 구조로, 행과 열로 구성되며, 다양한 유형의 데이터를 포함할 수 있습니다.
- 데이터 불러오기 및 저장
- CSV, Excel, SQL, JSON 등 다양한 파일 형식에서 데이터를 쉽게 불러오고 저장할 수 있습니다.
- 데이터 탐색 및 조작
- 데이터 조회: head(), tail(), info(), describe() 등을 사용하여 데이터의 개요를 파악할 수 있습니다.
- 데이터 선택: loc 및 iloc 인덱서를 사용하여 데이터의 특정 부분을 선택할 수 있습니다.
- 데이터 정리
- 결측값 처리: dropna(), fillna() 등을 사용하여 결측값을 처리할 수 있습니다.
- 데이터 정렬: sort_values()를 사용하여 데이터를 정렬할 수 있습니다.
- 중복 제거: drop_duplicates()를 사용하여 중복된 데이터를 제거할 수 있습니다.
- 데이터 변환
- 데이터 프레임 합치기: merge(), concat() 등을 사용하여 데이터를 병합할 수 있습니다.
- 그룹화 및 집계: groupby()와 agg()를 사용하여 데이터를 그룹화하고 요약 통계를 계산할 수 있습니다.
- 시계열 데이터 처리
- 판다스는 시계열 데이터의 변환, 조작, 분석을 위한 다양한 기능을 제공합니다.
판다스의 장점
- 강력한 데이터 처리 기능: 다양한 형식의 데이터를 쉽게 불러오고 조작할 수 있습니다.
- 유연한 데이터 구조: Series와 DataFrame을 사용하여 다양한 데이터 유형을 처리할 수 있습니다.
- 풍부한 함수와 메서드: 데이터 분석과 조작을 위한 풍부한 함수와 메서드를 제공합니다.
- 다양한 파일 형식 지원: CSV, Excel, SQL, JSON 등 다양한 파일 형식의 데이터를 처리할 수 있습니다.
- 통계 및 시각화 라이브러리와의 통합: Numpy, Matplotlib, Seaborn 등과 같은 다른 데이터 분석 및 시각화 라이브러리와 쉽게 통합할 수 있습니다.
자 판다스 설명은 이정도로 하고 이제 예제를 통해 조금 더 자세히 알려드리겠습니다.
1. 파일 불러와서 살펴보기
pandas 라이브러리의 read_csv() 등의 함수를 활용해서 데이터 불러오기 가능 아래의 표현들을 활용해서 데이터 파일의 경로 지정 필요
- / : root. Windows에서는 C:\
- ~/ : 사용자 폴더. Windows에서는 C:\Users\사용자계정이름
- ./ : 현재 작업 폴더(working directory), 별도로 작업하지 않은 경우 생략 가능
- ../ : 현재 폴더의 상위 폴더
바탕화면처럼 익숙한 곳에 새로운 폴더를 만들고, 데이터 파일을 옮겨서 작업하는 것을 추천합니다.
차후 데이터를 불러오기 위해 위치를 지정해야 하는데 그때 편하게 사용하기 위함입니다.
우리가 저장된 데이터파일을 불러오기 위해서는 데이터파일의 위치를 코드를 통해 알려줘야겠죠?
바탕화면에 따로 폴더를 만들어 저장하라고 했던 이유가 여기에 있습니다.
%pwd
먼저 내가 코드파일을 저장한 위치를 알아보는 코드를 알려드리겠습니다.
그 위치에 데이터파일도 넣어뒀으니 사용하기 편리하겠죠?
%pwd
>>>'C:\\Users\\junsu\\Desktop\\ABC 부트캠프'
%pwd를 입력하면 이 코드파일이
"C드라이브안 Users폴더 안 junsu 폴더 안 Desktop 안 ABC부트캠프 폴더에 있다"라고 알려주는 것입니다.
만약 data폴더 안 1.csv 파일의 경로를 지정하려 한다면
'C:\\Users\\junsu\\Desktop\\ABC 부트캠프\\data\\1.csv' 이렇게 되는거죠
1.1. CSV 파일 불러오기
pandas 라이브러리 불러오기
import pandas as pd
# pandas의 read_csv( ) 활용
df_ins= pd.read_csv("./data/insurance.csv")
# df_ins= pd.read_csv("data/insurance.csv")
df_ins
>>>
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
... ... ... ... ... ... ... ...
1333 50 male 30.970 3 no northwest 10600.54830
1334 18 female 31.920 0 no northeast 2205.98080
1335 18 female 36.850 0 no southeast 1629.83350
1336 21 female 25.800 0 no southwest 2007.94500
1337 61 female 29.070 0 yes northwest 29141.36030
- import pandas as pd를 이용해서 pasdas 라이브러리를 불러옵니다.
- pandas의 read_csv() 를 이용해서 csv파일을 불러옵니다.
타입확인
type(df_ins)
>>>pandas.core.frame.DataFrame
메서드의 확인
type(df_ins.age)
>>> pandas.core.series.Series
1.2 데이터 살펴보기
head()로 앞에 몇개 관측치 확인하기
- 괄호 안에 원하는 숫자를 넣으면 그만큼 앞에서부터 표시해주고 괄호를 빈칸으로 놔두면 5개만 보여줍니다.
df_ins.head(10)
>>>
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
5 31 female 25.740 0 no southeast 3756.62160
6 46 female 33.440 1 no southeast 8240.58960
7 37 female 27.740 3 no northwest 7281.50560
8 37 male 29.830 2 no northeast 6406.41070
9 60 female 25.840 0 no northwest 28923.13692
tail()로 끝 몇 개 관측치 확인하기
- head()와는 반대로 tail()은 뒤에서부터 확인시켜줍니다.
df_ins.tail(10)
>>>
age sex bmi children smoker region charges
1328 23 female 24.225 2 no northeast 22395.74424
1329 52 male 38.600 2 no southwest 10325.20600
1330 57 female 25.740 2 no southeast 12629.16560
1331 23 female 33.400 0 no southwest 10795.93733
1332 52 female 44.700 3 no southwest 11411.68500
1333 50 male 30.970 3 no northwest 10600.54830
1334 18 female 31.920 0 no northeast 2205.98080
1335 18 female 36.850 0 no southeast 1629.83350
1336 21 female 25.800 0 no southwest 2007.94500
1337 61 female 29.070 0 yes northwest 29141.36030
관측치/변수 개수 확인
a = df_ins.shape
a = 0
관측치 개수만 확인
df_ins.shape[0]
>>> 1338
index(행 이름) 확인
df_ins.index
>>> RangeIndex(start=0, stop=1338, step=1)
columns(변수 이름)확인
list(df_ins.columns)
>>> Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')
변수 형식확인
df_ins.dtypes
[실습] data 폴더의 PulseRates.csv를 불러와서 df_pr로 저장하기
- 이후 자유롭게 데이터 탐색하기
import pandas as a
df_pr = a.read_csv("./data/PulseRates.csv")
df_pr.shape
df_pr.dtypes
df_pr.head()
df_pr.tail()
df_pr.index
df_pr.columns
[참고] Encoding 지정 및 index, header 지정
# csv 파일의 인코딩 문제
pd.read_csv('./data/고용지표_20221115084415.csv')
>>>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 1: invalid start byte
이 코드를 실행 하였을때 UnicodeDecodeError가 발생하는데요.
그 이유는 파일 인코딩 방식이 'utf-8'과 맞지 않기 때문입니다.
이것을 해결하는 방법은 옵션 encoding = 'CP949'를 추가해주는 방법이 있습니다.
pd.read_csv('./data/고용지표_20221115084415.csv', encoding='CP949')
>>>
성별(1) 2021. 08 2021. 08.1 2021. 08.2 2021. 09 2021. 09.1 2021. 09.2 2021. 10 2021. 10.1 2021. 10.2 ... 2022. 04.2 2022. 05 2022. 05.1 2022. 05.2 2022. 06 2022. 06.1 2022. 06.2 2022. 07 2022. 07.1 2022. 07.2
0 성별(1) 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 ... 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률
1 합계 61.7 4.0 59.2 61.9 3.6 59.7 62.1 4.2 59.5 ... 60.4 63.0 3.5 60.8 63.0 3.4 60.8 62.9 3.3 60.9
2 남자 70.0 4.1 67.1 70.3 3.8 67.7 70.6 4.6 67.3 ... 68.7 71.8 3.7 69.2 71.6 3.3 69.2 71.3 3.4 68.9
3 여자 54.2 3.9 52.1 54.3 3.4 52.5 54.5 3.7 52.5 ... 52.9 55.0 3.3 53.2 55.2 3.6 53.2 55.4 3.1 53
4 rows × 37 columns
index, header 지정
pd.read_csv('./data/고용지표_20221115084415.csv', encoding='CP949', index_col=0, header=[0,1])
>>>
성별(1) 2021. 08 2021. 09 2021. 10 2021. 11 ... 2022. 04 2022. 05 2022. 06 2022. 07
성별(1) 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 경제활동참가율 ... 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률 경제활동참가율 실업률 고용률
합계 61.7 4.0 59.2 61.9 3.6 59.7 62.1 4.2 59.5 62.5 ... 60.4 63.0 3.5 60.8 63.0 3.4 60.8 62.9 3.3 60.9
남자 70.0 4.1 67.1 70.3 3.8 67.7 70.6 4.6 67.3 71.2 ... 68.7 71.8 3.7 69.2 71.6 3.3 69.2 71.3 3.4 68.9
여자 54.2 3.9 52.1 54.3 3.4 52.5 54.5 3.7 52.5 54.6 ... 52.9 55.0 3.3 53.2 55.2 3.6 53.2 55.4 3.1 53.0
3 rows × 36 columns
자 여기까지가 오전 수업 내용이었습니다.
이제 점심시간!!

오늘의 메뉴는???
오늘도 맛있게 잘 먹었습니다. 6000원의 행복이랄까요..?ㅎㅎ
자 이제 오후 강의시간이 다가왔으니 데이터 전처리에 대해 알아볼까요?
데이터 전처리란 무엇일까요? 전처리..? 데이터를 전처리한다..?
말그대로 데이터를 사용하기 위해 사전 처리하는 과정을 말해요.
데이터 전처리는 머신러닝 및 데이터 분석 과정에서 매우 중요한 단계입니다.
원시 데이터를 모델링에 적합하게 만드는 과정을 통칭하는데요.
이 과정을 통해 데이터의 품질을 높이고 분석결과의 신뢰성을 보장합니다.
주요 단계
- 데이터 수집
- 데이터 이해
- 데이터 정제
- 결측값 처리
- 이상치 처리
- 중복 데이터 제거
- 데이터 변환
- 데이터 정규화/표준화 : 데이터의 범위를 일정하게 맞춥니다.
- 인코딩 : 범주형 데이터를 숫자로 변환합니다.
- 특성 선택
- 데이터 분할
- 데이터 증강
- 데이터 저장
등의 순서로 진행 됩니다.
오늘 저희가 진행한 내용은 데이터 결합 및 부분 선택 입니다.
시작해보죠
1. 데이터 결합
1.1. concat( )을 활용한 동일 구조 데이터 행 결합
구조는 똑같고 기간이나 상품만 다른 여러 데이터가 있으면 pandas의 concat() 으로 결합해서 활용함수 안에서 axis=0옵션을 활용해서 행 결합(아래로 이어 붙이기)을 할 수 있고, axis=1로 열 결합도 가능axis=0이 기본값며 생략 가능
import pandas as pd
# 행 결합
## 출처 : 국토교통부 실거래가(http://rtdown.molit.go.kr/)
df_apt1 = pd.read_csv('./data/아파트(매매)__실거래가_20210902153616.csv', skiprows=15, encoding='CP949')
df_apt1
>>>
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일
0 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.9200 202108 21 199,500 6 2020 개포로 264 NaN
1 서울특별시 강남구 개포동 185 185 0 개포주공 7단지 83.7000 202108 20 280,000 2 1983 개포로 516 NaN
2 서울특별시 강남구 개포동 138 138 0 디에이치아너힐즈 59.8732 202108 17 233,000 4 2019 삼성로 11 NaN
3 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 59.9670 202108 14 227,000 10 2019 선릉로 8 NaN
4 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 49.8600 202108 1 169,000 10 1992 개포로109길 9 NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ...
231 서울특별시 강남구 청담동 14 14 0 청담2차 이-편한세상(201동,202동,203동) 84.9700 202108 14 200,000 7 2006 도산대로70길 25 NaN
232 서울특별시 강남구 청담동 15-21 15 21 청담2차 이-편한세상(205동) 119.5500 202108 9 215,000 3 2006 도산대로78길 51 NaN
233 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202108 17 22,000 4 2015 학동로73길 13 NaN
234 서울특별시 강남구 청담동 134-38 134 38 청담자이 89.3560 202108 4 400,000 16 2011 영동대로138길 12 NaN
235 서울특별시 강남구 청담동 134-38 134 38 청담자이 82.3650 202108 10 293,000 25 2011 영동대로138길 12 NaN
236 rows × 13 columns
df_apt2 = pd.read_csv('./data/아파트(매매)__실거래가_20210902153636.csv', skiprows=15, encoding='CP949')
df_apt2.shape
>>>(74, 13)
df_apt3 = pd.read_csv('./data/아파트(매매)__실거래가_20210902153655.csv', skiprows=15, encoding='CP949')
df_apt3.shape
>>> (76, 13)
df_apt = pd.concat([df_apt1, df_apt2, df_apt3], axis=0)
df_apt
>>>
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일
0 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.9200 202108 21 199,500 6 2020 개포로 264 NaN
1 서울특별시 강남구 개포동 185 185 0 개포주공 7단지 83.7000 202108 20 280,000 2 1983 개포로 516 NaN
2 서울특별시 강남구 개포동 138 138 0 디에이치아너힐즈 59.8732 202108 17 233,000 4 2019 삼성로 11 NaN
3 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 59.9670 202108 14 227,000 10 2019 선릉로 8 NaN
4 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 49.8600 202108 1 169,000 10 1992 개포로109길 9 NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ...
71 서울특별시 송파구 풍납동 220-2 220 2 신동아파밀리에 59.3600 202108 1 85,900 8 1993 풍성로6길 15 NaN
72 서울특별시 송파구 풍납동 510 510 0 신성노바빌아파트 59.7800 202108 16 98,500 15 2000 한가람로 468 NaN
73 서울특별시 송파구 풍납동 401-1 401 1 쌍용 84.8500 202108 11 143,000 15 1994 올림픽로47길 12 NaN
74 서울특별시 송파구 풍납동 508 508 0 한강극동 84.7600 202108 25 111,000 11 1995 토성로 38-6 NaN
75 서울특별시 송파구 풍납동 260 260 0 현대리버빌1지구 43.2000 202108 7 71,500 1 1999 토성로 37 NaN
386 rows × 13 columns
DataFrame에서 행 번호에 해당하는 index는 중요한 역할을 합니다.
예를 들어 아래처럼 index를 확인할 수 있고, 특정 index를 지정해서 관측치를 선택하는 것도 가능합니다.
df_apt.index
>>>
Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
...
66, 67, 68, 69, 70, 71, 72, 73, 74, 75],
dtype='int64', length=386)
index 0 관측치 선택
df_apt.loc[0]
>>>
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일
0 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.92 202108 21 199,500 6 2020 개포로 264 NaN
0 서울특별시 서초구 내곡동 BL-1 1 0 서초더샵포레 114.71 202108 14 185,000 8 2014 헌릉로8길 58 NaN
0 서울특별시 송파구 가락동 95-1 95 1 가락금호아파트 59.91 202108 8 123,000 1 1997 송파대로32길 15 NaN
결합 이전 기존 Index 활용으로 0 인덱스 관측치의 중복 발생
행 결합이나 정렬 이후 인덱스를 재지정하거나 초기화 필요
reset_index()을 활용한 index 초기화
drop=True: 기존 인덱스를 변수로 추가할 지 버릴지 선택
df_apt.reset_index(inplace=True)
# index 0 관측치 재선택
df_apt.loc[0]
>>>
index 0
시군구 서울특별시 강남구 개포동
번지 1282
본번 1282
부번 0
단지명 개포래미안포레스트
전용면적(㎡) 59.92
계약년월 202108
계약일 21
거래금액(만원) 199,500
층 6
건축년도 2020
도로명 개포로 264
해제사유발생일 NaN
Name: 0, dtype: object
type(df_apt.loc[0])
>>>
pandas.core.series.Series
[실습] 데이터 결합 및 인덱스 초기화
- data폴더의 CARD_SUBWAY_MONTH_로 시작하는 3개 데이터 확인하기
- 1.의 데이터를 각각 불러와서 저장하고, pd.concat()으로 행 결합하기(encoding='CP949' 활용)
- index 초기화 하기
import pandas as pd
df_sub1 = pd.read_csv('./data/CARD_SUBWAY_MONTH_201907.csv', encoding='CP949')
df_sub2 = pd.read_csv('./data/CARD_SUBWAY_MONTH_202007.csv', encoding='CP949')
df_sub3 = pd.read_csv('./data/CARD_SUBWAY_MONTH_202107.csv', encoding='CP949')
df_sub1.shape[0],df_sub2.shape[0],df_sub2.shape[0]
df_sub = pd.concat([df_sub1,df_sub2,df_sub3],axis=0)
df_sub.reset_index(drop = True, inplace=True)
df_sub
>>>
사용일자 노선명 역명 승차총승객수 하차총승객수 등록일자
0 20190701 1호선 종로3가 34944.0 32751.0 20190704
1 20190701 1호선 종로5가 28640.0 28862.0 20190704
2 20190701 1호선 동대문 14793.0 16182.0 20190704
3 20190701 1호선 신설동 17911.0 17483.0 20190704
4 20190701 1호선 제기동 21946.0 22345.0 20190704
... ... ... ... ... ... ...
55261 20210731 경원선 청량리(서울시립대입구) 11320.0 13138.0 20210803
55262 20210731 경원선 외대앞 4261.0 4279.0 20210803
55263 20210731 경원선 신이문 4666.0 4313.0 20210803
55264 20210731 2호선 용두(동대문구청) 1292.0 1364.0 20210803
55265 20210731 2호선 신정네거리 5350.0 5383.0 20210803
55266 rows × 6 columns
데이터를 읽어오는데 더 쉽게 해주는 라이브러리가 있는데요.
바로 glob입니다.
import glob as g
path_list = g.glob('./data/CARD_SUBWAY_MONTH_*.csv')
path_list
>>>
['./data\\CARD_SUBWAY_MONTH_201907.csv',
'./data\\CARD_SUBWAY_MONTH_202007.csv',
'./data\\CARD_SUBWAY_MONTH_202107.csv']
import pandas as pd
path_list = g.glob('./data/CARD_SUBWAY_MONTH_*.csv')
targets = []
for x in path_list:
df_temp = pd.read_csv(x, encoding='CP949')
targets.append(df_temp)
df_subway = pd.concat(targets, axis=0)
# index 초기화 하기
df_subway.reset_index(drop=True, inplace=True)
df_subway
>>>
사용일자 노선명 역명 승차총승객수 하차총승객수 등록일자
0 20190701 1호선 종로3가 34944.0 32751.0 20190704
1 20190701 1호선 종로5가 28640.0 28862.0 20190704
2 20190701 1호선 동대문 14793.0 16182.0 20190704
3 20190701 1호선 신설동 17911.0 17483.0 20190704
4 20190701 1호선 제기동 21946.0 22345.0 20190704
... ... ... ... ... ... ...
55261 20210731 경원선 청량리(서울시립대입구) 11320.0 13138.0 20210803
55262 20210731 경원선 외대앞 4261.0 4279.0 20210803
55263 20210731 경원선 신이문 4666.0 4313.0 20210803
55264 20210731 2호선 용두(동대문구청) 1292.0 1364.0 20210803
55265 20210731 2호선 신정네거리 5350.0 5383.0 20210803
55266 rows × 6 columns
[참고] glob과 for 반복문을 활용한 복수 데이터 처리
glob 라이브러리의 glob() 을 활용하면 복수의 데이터 경로를 손쉽게 처리 가능
대상 파일 목록 생성
from glob import glob
file_list = glob('data/apt/*.csv')
file_list
>>>
['data/apt\\아파트(매매)__실거래가_20220930082940.csv',
'data/apt\\아파트(매매)__실거래가_20220930083006.csv',
'data/apt\\아파트(매매)__실거래가_20220930083033.csv',
'data/apt\\아파트(매매)__실거래가_20220930083102.csv',
'data/apt\\아파트(매매)__실거래가_20220930083124.csv',
'data/apt\\아파트(매매)__실거래가_20220930083151.csv',
'data/apt\\아파트(매매)__실거래가_20220930083220.csv',
'data/apt\\아파트(매매)__실거래가_20220930083248.csv']
for을 활용한 반복
target = list()
for path_ in file_list:
target.append(pd.read_csv(path_, skiprows=15, encoding='CP949'))
target
>>>
[ 시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 \
0 서울특별시 강남구 개포동 12 12 0 삼익대청아파트 39.5300 202208 8
1 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 49.8600 202208 10
48 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 59.9300 202208 26
49 서울특별시 강남구 청담동 134 134 0 래미안청담로이뷰 110.2000 202208 8
50 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202208 22
51 서울특별시 강남구 청담동 122-35 122 35 청담신원아침도시마인 27.0875 202208 19
52 서울특별시 강남구 청담동 43 43 0 청담우방아파트 59.9700 202208 5
거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 119,000 12 1992 개포로109길 21 NaN 중개거래 서울 강남구
1 133,000 1 1992 개포로109길 9 NaN 중개거래 서울 강남구
2 136,000 14 1992 개포로109길 9 NaN 중개거래 서울 강남구, 서울 서초구
3 38,500 11 2004 학동로 165 NaN 중개거래 서울 강남구, 서울 서초구
24 275,000 10 2004 언주로30길 21 NaN 중개거래 서울 강남구
25 330,000 9 1985 언주로 117 NaN 중개거래 서울 강남구
26 640,000 64 2004 언주로30길 26 NaN 중개거래 서울 강남구
27 35,000 13 2004 테헤란로63길 12 NaN 중개거래 서울 강남구
28 445,000 6 2010 영동대로128길 45 NaN 중개거래 서울 강남구
29 280,000 22 2008 학동로68길 29 NaN 중개거래 서울 강남구
51 36,000 6 2013 도산대로85길 30 NaN 중개거래 서울 강남구
52 160,000 9 1999 학동로 409 NaN 중개거래 서울 강남구 ,
시군구 번지 본번 부번 단지명 전용면적(㎡) \
0 서울특별시 강남구 개포동 12-2 12 2 개포자이(12-2) 170.3200
1 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 59.8880
45 202207 26 200,000 29 2016 언주로 420 NaN 직거래
46 202207 5 20,500 7 2003 언주로90길 6 NaN 중개거래
47 202207 5 42,000 2 1996 도곡로3길 26 NaN 중개거래
48 202207 21 285,000 4 1995 도산대로85길 53 NaN 중개거래
49 202207 7 315,000 3 2004 도산대로87길 23 NaN 중개거래
50 202207 8 430,000 2 2008 도산대로59길 25 NaN 직거래
51 202207 27 450,000 1 2008 도산대로59길 25 NaN 중개거래
중개사소재지
0 서울 강남구
1 서울 강남구
2 서울 강남구
서울 강남구
44 서울 강남구
45 -
46 서울 강남구
47 서울 강남구
48 서울 강남구
49 서울 강남구
50 -
51 서울 강남구, 서울 서초구 ,
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 \
0 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.920 202206 17
1 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 99.991 202206 10
2 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 59.967 202206 28
3 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 33.180 202206 1
4 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 33.180 202206 30
.. ... ... ... .. ... ... ... ...
63 서울특별시 강남구 역삼동 706-20 706 20 한화진넥스빌 34.820 202206 27
64 서울특별시 강남구 일원동 711 711 0 수서 39.980 202206 11
65 서울특별시 강남구 청담동 117-6 117 6 대우로얄카운티3 244.720 202206 16
66 서울특별시 강남구 청담동 62-6 62 6 청담디에브스아파트 91.680 202206 27
67 서울특별시 강남구 청담동 134-38 134 38 청담자이 90.197 202206 14
거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 195,000 10 2020 개포로 264 NaN 중개거래 서울 강남구
1 360,000 32 2019 선릉로 8 NaN 중개거래 서울 강남구
2 214,000 5 2019 선릉로 8 NaN 중개거래 서울 강남구
3 108,000 15 1992 개포로109길 9 NaN 중개거래 서울 강남구
4 95,000 4 1992 개포로109길 9 NaN 중개거래 서울 강남구
.. ... .. ... ... ... ... ...
63 33,700 26 2001 언주로86길 11 NaN 중개거래 서울 강남구
64 103,000 14 1992 양재대로55길 12 NaN 중개거래 경기 광명시, 서울 강남구
65 495,000 3 2003 도산대로83길 23 NaN 중개거래 서울 강남구
66 117,562 3 2017 도산대로92길 28 NaN 직거래 -
67 355,000 27 2011 영동대로138길 12 NaN 중개거래 서울 강남구
[68 rows x 15 columns],
시군구 번지 본번 부번 단지명 전용면적(㎡) \
0 서울특별시 강남구 개포동 658-1 658 1 개포6차우성아파트1동~8동 79.9700
1 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 136.0600
2 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.9200
3 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 59.9200
4 서울특별시 강남구 개포동 138 138 0 디에이치아너힐즈 59.8732
.. ... ... ... .. ... ...
109 서울특별시 강남구 청담동 14 14 0 청담2차이-편한세상(201동,202동,203동) 101.7000
110 서울특별시 강남구 청담동 30-33 30 33 청담대림이-편한세상 134.2400
111 서울특별시 강남구 청담동 101-1 101 1 청담대우로얄카운티6차 166.3000
112 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250
113 서울특별시 강남구 청담동 122-35 122 35 청담신원아침도시마인 27.0875
계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 202205 27 216,000 2 1987 언주로 3 NaN 중개거래 서울 강남구
1 202205 2 420,000 17 2020 개포로 264 NaN 중개거래 서울 강남구
2 202205 12 203,500 5 2020 개포로 264 NaN 중개거래 서울 강남구
3 202205 26 210,000 6 2020 개포로 264 NaN 중개거래 서울 강남구
4 202205 11 238,000 28 2019 삼성로 11 NaN 중개거래 서울 강남구
.. ... ... ... .. ... ... ... ... ...
109 202205 24 214,000 6 2006 도산대로70길 25 NaN 중개거래 서울 강남구
110 202205 17 280,000 8 2002 학동로77길 27 NaN 중개거래 서울 강남구
111 202205 18 330,000 5 2005 압구정로71길 20 NaN 중개거래 서울 강남구
112 202205 11 23,500 4 2015 학동로73길 13 NaN 중개거래 서울 강남구
113 202205 26 33,900 5 2013 도산대로85길 30 NaN 중개거래 서울 강남구
[114 rows x 15 columns],
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 \
0 서울특별시 강남구 개포동 658-1 658 1 개포6차우성아파트1동~8동 79.9700 202204 12
1 서울특별시 강남구 개포동 658-1 658 1 개포6차우성아파트1동~8동 79.9700 202204 21
2 서울특별시 강남구 개포동 1282 1282 0 개포래미안포레스트 102.3200 202204 1
3 서울특별시 강남구 개포동 649 649 0 경남2차 186.1600 202204 19
4 서울특별시 강남구 개포동 138 138 0 디에이치아너힐즈 76.1709 202204 8
.. ... ... ... .. ... ... ... ...
108 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202204 1
109 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202204 4
110 서울특별시 강남구 청담동 34-13 34 13 청담스위트 12.4490 202204 27
111 서울특별시 강남구 청담동 64-1 64 1 청담어퍼하우스 200.3800 202204 15
112 서울특별시 강남구 청담동 101-17 101 17 효성빌라청담101(B동) 226.6200 202204 12
거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 220,000 4 1987 언주로 3 NaN 중개거래 서울 강남구
1 220,000 2 1987 언주로 3 NaN 중개거래 서울 강남구
2 369,000 13 2020 개포로 264 NaN 중개거래 서울 강남구, 서울 양천구
3 400,000 8 1984 언주로 110 NaN 중개거래 서울 강남구
4 305,000 23 2019 삼성로 11 NaN 중개거래 서울 강남구
.. ... .. ... ... ... ... ...
108 25,000 5 2015 학동로73길 13 NaN 중개거래 서울 서초구
109 23,000 2 2015 학동로73길 13 NaN 중개거래 서울 서초구
110 23,300 5 2015 학동로73길 13 NaN 중개거래 서울 강남구
111 675,000 2 2019 학동로81길 28 NaN 중개거래 서울 강남구
112 747,000 5 2019 압구정로71길 28 NaN 중개거래 서울 강남구
[113 rows x 15 columns],
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 \
0 서울특별시 강남구 개포동 185 185 0 개포주공6단지 73.0200 202203 18
1 서울특별시 강남구 개포동 185 185 0 개포주공7단지 53.4600 202203 17
2 서울특별시 강남구 개포동 185 185 0 개포주공7단지 73.2600 202203 18
3 서울특별시 강남구 개포동 649 649 0 경남1 123.2800 202203 8
4 서울특별시 강남구 개포동 12 12 0 삼익대청아파트 51.1200 202203 26
.. ... ... ... .. ... ... ... ...
88 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202203 2
89 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202203 11
90 서울특별시 강남구 청담동 34-13 34 13 청담스위트 13.4250 202203 11
91 서울특별시 강남구 청담동 34-13 34 13 청담스위트 12.4490 202203 24
92 서울특별시 강남구 청담동 122-35 122 35 청담신원아침도시마인 28.3132 202203 15
거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 270,000 5 1983 개포로 516 NaN 중개거래 서울 강남구
1 211,500 4 1983 개포로 516 NaN 중개거래 서울 강남구
2 265,000 6 1983 개포로 516 NaN 중개거래 서울 강남구
3 343,000 4 1984 언주로 110 NaN 중개거래 서울 강남구
4 157,000 2 1992 개포로109길 21 NaN 중개거래 서울 강남구
.. ... .. ... ... ... ... ...
88 24,000 7 2015 학동로73길 13 20220308.0 중개거래 서울 서초구
89 22,750 5 2015 학동로73길 13 NaN 중개거래 서울 강남구
90 19,000 8 2015 학동로73길 13 NaN 직거래 -
91 22,700 5 2015 학동로73길 13 NaN 중개거래 서울 강남구
92 33,250 5 2013 도산대로85길 30 NaN 중개거래 서울 강남구
[93 rows x 15 columns],
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 \
0 서울특별시 강남구 개포동 12-2 12 2 개포자이(12-2) 168.4200 202202 7
1 서울특별시 강남구 개포동 1167 1167 0 그린빌리지 197.9100 202202 11
2 서울특별시 강남구 개포동 138 138 0 디에이치아너힐즈 131.3226 202202 22
3 서울특별시 강남구 논현동 225-6 225 6 논현아이파크 47.4600 202202 23
4 서울특별시 강남구 논현동 105 105 0 동현아파트1~6 84.9200 202202 18
.. ... ... ... .. ... ... ... ...
61 서울특별시 강남구 청담동 90-13 90 13 에비뉴나인티 49.6100 202202 21
62 서울특별시 강남구 청담동 102-2 102 2 연세힐하우스1 187.7300 202202 14
63 서울특별시 강남구 청담동 122-35 122 35 청담신원아침도시마인 28.3132 202202 23
64 서울특별시 강남구 청담동 122-35 122 35 청담신원아침도시마인 49.4473 202202 25
65 서울특별시 강남구 청담동 5-25 5 25 휴먼스타빌 35.9050 202202 28
거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 246,000 2 2004 개포로109길 69 NaN 중개거래 서울 강남구
1 180,000 4 1996 논현로4길 28 NaN 중개거래 서울 서초구
2 590,000 8 2019 삼성로 11 NaN 중개거래 서울 강남구
3 100,000 7 2020 언주로 615 20220320.0 중개거래 서울 동대문구
4 227,500 10 1985 언주로146길 18 NaN 중개거래 서울 강남구
.. ... .. ... ... ... ... ...
61 156,200 2 2020 도산대로59길 24 NaN 직거래 -
62 300,000 1 2003 압구정로71길 30-11 NaN 중개거래 서울 강남구
63 29,800 6 2013 도산대로85길 30 NaN 중개거래 서울 강남구
64 82,500 8 2013 도산대로85길 30 NaN 중개거래 서울 강남구
65 80,000 14 2005 도산대로 454 NaN 중개거래 서울 강남구
[66 rows x 15 columns],
시군구 번지 본번 부번 단지명 전용면적(㎡) \
0 서울특별시 강남구 개포동 185 185 0 개포주공6단지 83.2100
1 서울특별시 강남구 개포동 1280 1280 0 래미안블레스티지 84.9430
2 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 33.1800
특별시 강남구 일원동 718 718 0 샘터마을 101.9700
54 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 51.9600
55 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 51.9900
56 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 51.9600
57 서울특별시 강남구 청담동 76-12 76 12 라테라스청담 18.6200
58 서울특별시 강남구 청담동 10 10 0 삼환아파트101동 84.9100
59 서울특별시 강남구 청담동 134-16 134 16 신동아 84.9400
계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 \
0 202201 15 280,000 8 1983 개포로 516 NaN 중개거래
1 202201 15 300,000 7 2019 선릉로 8 NaN 중개거래
2 202201 8 125,000 7 1992 개포로109길 9 NaN 중개거래
56 202201 17 118,000 11 2015 자곡로3길 21 NaN 중개거래
57 202201 17 34,000 8 2018 학동로81길 9 NaN 중개거래
58 202201 17 170,000 2 1999 학동로77길 49 NaN 중개거래
59 202201 19 220,000 2 1997 학동로105길 30 NaN 중개거래
중개사소재지
0 서울 강남구
1 서울 강남구
서울 강남구
57 서울 강남구
58 서울 강남구
59 서울 강남구 ]
최종 작업
df_subway = pd.concat(target, axis=0).reset_index(drop=True)
df_subway\
>>>
시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 거래금액(만원) 층 건축년도 도로명 해제사유발생일 거래유형 중개사소재지
0 서울특별시 강남구 개포동 12 12 0 삼익대청아파트 39.53 202208 8 119,000 12 1992 개포로109길 21 NaN 중개거래 서울 강남구
1 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 49.86 202208 10 133,000 1 1992 개포로109길 9 NaN 중개거래 서울 강남구
2 서울특별시 강남구 개포동 12 12 0 성원대치2단지아파트 49.86 202208 31 136,000 14 1992 개포로109길 9 NaN 중개거래 서울 강남구, 서울 서초구
3 서울특별시 강남구 논현동 58-2 58 2 마일스디오빌 36.29 202208 6 38,500 11 2004 학동로 165 NaN 중개거래 서울 강남구, 서울 서초구
4 서울특별시 강남구 논현동 58-2 58 2 마일스디오빌 36.29 202208 8 38,000 14 2004 학동로 165 NaN 중개거래 서울 강남구
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
614 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 51.99 202201 8 103,000 7 2015 자곡로3길 21 20220502.0 중개거래 서울 강남구
615 서울특별시 강남구 자곡동 619 619 0 엘에이치강남힐스테이트 51.96 202201 17 118,000 11 2015 자곡로3길 21 NaN 중개거래 서울 강남구
616 서울특별시 강남구 청담동 76-12 76 12 라테라스청담 18.62 202201 17 34,000 8 2018 학동로81길 9 NaN 중개거래 서울 강남구
617 서울특별시 강남구 청담동 10 10 0 삼환아파트101동 84.91 202201 17 170,000 2 1999 학동로77길 49 NaN 중개거래 서울 강남구
618 서울특별시 강남구 청담동 134-16 134 16 신동아 84.94 202201 19 220,000 2 1997 학동로105길 30 NaN 중개거래 서울 강남구
619 rows × 15 columns
1.2. merge()를 활용한 KEY 변수 기준 결합
SQL의 JOIN, Excel의 VLOOKUP()과 같이 KEY 변수를 활용한 데이터 결합은 merge() 를 활용
df_left = pd.read_csv('./data/data_left.csv')
df_right = pd.read_csv('./data/data_right.csv')
df_left
>>>
product_id category sales
0 P001 A 100
1 P002 B 300
2 P003 None 100
3 P005 A 200
df_right
>>>
category name manager_id
0 A Food E009
1 B Beverage E009
2 C Industrial E010
key를 활용한 데이터 결합에서는 일치하는 key가 있는, 짝이 있는 관측치만 출력하는 것이 기본값으로 설정되어 있습니다. SQL에서는 이것을 inner join이라고 부릅니다.
merge() 에서 how= 옵션을 활용해서 다음과 같은 데이터 결합 방법 지정
- inner: inner join. key 기준 일치하는 관측치만 포함
- left: left join. inner join의 결과물과 왼쪽 데이터의 짝 없는 관측치 포함
- right: right join. inner join의 결과물과 오른쪽 데이터의 짝 없는 관측치 포함
- outer: full outer join. inner join과 양쪽 데이터의 짝이 없는 모든 관측치 포함
marge()를 활용한 결합
pd.merge(df_left, df_right, how='inner', on='category')
>>>
product_id category sales name manager_id
0 P001 A 100 Food E009
1 P005 A 200 Food E009
2 P002 B 300 Beverage E009
left join
pd.merge(df_left, df_right, how='left', on='category')
>>>
product_id category sales name manager_id
0 P001 A 100 Food E009
1 P002 B 300 Beverage E009
2 P003 None 100 NaN NaN
3 P005 A 200 Food E009
right goin
pd.merge(df_left, df_right, how='right', on='category')
>>>
product_id category sales name manager_id
0 P001 A 100.0 Food E009
1 P005 A 200.0 Food E009
2 P002 B 300.0 Beverage E009
3 NaN C NaN Industrial E010
full outer join
pd.merge(df_left, df_right, how='outer', on='category')
>>>
product_id category sales name manager_id
0 P001 A 100.0 Food E009
1 P005 A 200.0 Food E009
2 P002 B 300.0 Beverage E009
3 P003 None 100.0 NaN NaN
4 NaN C NaN Industrial E010
[실습] 데이터 결합
- data폴더의 production.csv를 불러와서 df_pd 로 저장하기
- data폴더의 weather.csv를 불러와서 df_wt 로 저장하기
- 두 데이터를 date를 기준으로 결합하기
import pandas as np
df_pd = pd.read_csv('./data/production.csv')
df_wt = pd.read_csv('./data/weather.csv')
pd.merge(df_pd, df_wt, how='left', on='date')
>>>
date factory line capacity production defective temp_high temp_low hum rain
0 2021-01-04 A 1 1000.0 979 3 0.3 -8.4 51.4 0.0
1 2021-01-04 A 2 1000.0 948 3 0.3 -8.4 51.4 0.0
2 2021-01-04 A 3 1000.0 962 4 0.3 -8.4 51.4 0.0
3 2021-01-04 B 4 1500.0 1473 3 0.3 -8.4 51.4 0.0
4 2021-01-04 B 5 1500.0 1462 5 0.3 -8.4 51.4 0.0
... ... ... ... ... ... ... ... ... ... ...
2236 2021-12-31 B 5 1500.0 1457 6 -3.9 -8.8 35.9 NaN
2237 2021-12-31 C 6 2000.0 1987 8 -3.9 -8.8 35.9 NaN
2238 2021-12-31 C 7 2000.0 2025 8 -3.9 -8.8 35.9 NaN
2239 2021-12-31 C 8 2000.0 2034 7 -3.9 -8.8 35.9 NaN
2240 2021-12-31 C 9 2000.0 2018 3 -3.9 -8.8 35.9 NaN
2241 rows × 10 columns
import pandas as pd
# 1. data폴더의 production.csv를 불러와서 df_pd 로 저장하기
df_pd = pd.read_csv('./data/production.csv')
print(df_pd.shape)
# 2. data폴더의 weather.csv를 불러와서 df_wt 로 저장하기
df_wt = pd.read_csv('./data/weather.csv')
print(df_wt.shape)
# 3. 두 데이터를 date를 기준으로 결합하기
pd.merge(df_pd, df_wt, how='right', on='date')
>>>
(2241, 6)
(365, 5)
date factory line capacity production defective temp_high temp_low hum rain
0 2021-01-01 NaN NaN NaN NaN NaN 1.6 -9.8 64.0 NaN
1 2021-01-02 NaN NaN NaN NaN NaN -1.4 -8.4 38.5 NaN
2 2021-01-03 NaN NaN NaN NaN NaN -2.0 -9.1 45.0 NaN
3 2021-01-04 A 1.0 1000.0 979.0 3.0 0.3 -8.4 51.4 0.0
4 2021-01-04 A 2.0 1000.0 948.0 3.0 0.3 -8.4 51.4 0.0
... ... ... ... ... ... ... ... ... ... ...
2352 2021-12-31 B 5.0 1500.0 1457.0 6.0 -3.9 -8.8 35.9 NaN
2353 2021-12-31 C 6.0 2000.0 1987.0 8.0 -3.9 -8.8 35.9 NaN
2354 2021-12-31 C 7.0 2000.0 2025.0 8.0 -3.9 -8.8 35.9 NaN
2355 2021-12-31 C 8.0 2000.0 2034.0 7.0 -3.9 -8.8 35.9 NaN
2356 2021-12-31 C 9.0 2000.0 2018.0 3.0 -3.9 -8.8 35.9 NaN
2357 rows × 10 columns
2. 데이터 부분 선택
일반적인 비즈니스 데이터 분석에서 주제와 기간, 사이트, 제품, 공정 등 본인의 업무와 관련이 있는 일부 데이터만 선택하고 활용
SQL을 활용한 데이터 추출 과정과 별개로 Python에서 각 분석 과정에서 맞게 부분 데이터를 다시 선택하고 사용
데이터 불러오기
df_ins = pd.read_csv('data/insurance.csv')
df_ins
>>>
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
... ... ... ... ... ... ... ...
1333 50 male 30.970 3 no northwest 10600.54830
1334 18 female 31.920 0 no northeast 2205.98080
1335 18 female 36.850 0 no southeast 1629.83350
1336 21 female 25.800 0 no southwest 2007.94500
1337 61 female 29.070 0 yes northwest 29141.36030
1338 rows × 7 columns
2.1. 데이터프레임의 변수(열) 선택 방법
- DataFrame 뒤에 마침표(.)를 찍고 Tab 키를 눌러 메서드들과 함께 변수(열)이름을 선택가능
- [] 연산자를 활용한 변수(열)의 선택 가능
.을 이용한 하나의 변수(열) 선택 (공백이 포함된 변수명일 경우 사용 불가)
df_ins.age of
선택 문법을 통한 열 선택 (공백이 포함된 변수명일 경우에도 사용 가능)
df_ins['age']
>>>
0 19
1 18
2 28
3 33
4 32
..
1333 50
1334 18
1335 18
1336 21
1337 61
Name: age, Length: 1338, dtype: int64
2.2. 대괄호를 활용한 데이터 부분 선택
DataFrame에 대괄호를 붙이고 슬라이스:로 관측치 번호를 지정하거나 따옴표''로 변수 이름을 넣어 데이터 부분을 선택 가능
변수 이름을 리스트 형식으로 묶어 넣어 여러개 변수를 한번에 선택 가능
한 변수 선택
type(df_ins['age'])
>>> pandas.core.series.Series
리스트를 활용한 복수 변수 선택
x =['age','smoker','charges']
df_ins[x]
>>>
age smoker charges
0 19 yes 16884.92400
1 18 no 1725.55230
2 28 no 4449.46200
3 33 no 21984.47061
4 32 no 3866.85520
... ... ... ...
1333 50 no 10600.54830
1334 18 no 2205.98080
1335 18 no 1629.83350
1336 21 no 2007.94500
1337 61 yes 29141.36030
1338 rows × 3 columns
관측치 선택
df_ins[0:3]
df_ins.head(3)
>>>
age sex bmi children smoker region charges
0 19 female 27.90 0 yes southwest 16884.9240
1 18 male 33.77 1 no southeast 1725.5523
2 28 male 33.00 3 no southeast 4449.4620
연속된 대괄호 활용가능
x = df_ins[['age','smoker','charges']][0:5]
x.shape[0]
>>> 5
[실습]
- 아래의 명령어를 실행해서 df_subway 데이터 생성하기
- .columns 변수(속성)를 활용해서 변수이름 확인하기
- 슬라이스를 활용하여 11~15번째 관측치(행) 선택하기
- '사용일자', '역명', '하차총승객수' 세 변수(열) 선택하기
df_sub
>>>
사용일자 노선명 역명 승차총승객수 하차총승객수 등록일자
0 20190701 1호선 종로3가 34944.0 32751.0 20190704
1 20190701 1호선 종로5가 28640.0 28862.0 20190704
2 20190701 1호선 동대문 14793.0 16182.0 20190704
3 20190701 1호선 신설동 17911.0 17483.0 20190704
4 20190701 1호선 제기동 21946.0 22345.0 20190704
... ... ... ... ... ... ...
55261 20210731 경원선 청량리(서울시립대입구) 11320.0 13138.0 20210803
55262 20210731 경원선 외대앞 4261.0 4279.0 20210803
55263 20210731 경원선 신이문 4666.0 4313.0 20210803
55264 20210731 2호선 용두(동대문구청) 1292.0 1364.0 20210803
55265 20210731 2호선 신정네거리 5350.0 5383.0 20210803
55266 rows × 6 columns
-------------------------------------------------------------------------------------------------
df_sub.columns
>>>Index(['사용일자', '노선명', '역명', '승차총승객수', '하차총승객수', '등록일자'], dtype='object')
-------------------------------------------------------------------------------------------------
df_sub[11:16]
>>>
사용일자 노선명 역명 승차총승객수 하차총승객수 등록일자
11 20190701 2호선 동대문역사문화공원 18590.0 21628.0 20190704
12 20190701 2호선 신당 16228.0 16636.0 20190704
13 20190701 2호선 상왕십리 16372.0 15797.0 20190704
14 20190701 2호선 왕십리(성동구청) 20431.0 16884.0 20190704
15 20190701 2호선 한양대 11036.0 12427.0 20190704
-------------------------------------------------------------------------------------------------
x = df_sub[['사용일자','역명','하차총승객수']]
x
>>>
사용일자 역명 하차총승객수
0 20190701 종로3가 32751.0
1 20190701 종로5가 28862.0
2 20190701 동대문 16182.0
3 20190701 신설동 17483.0
4 20190701 제기동 22345.0
... ... ... ...
55261 20210731 청량리(서울시립대입구) 13138.0
55262 20210731 외대앞 4279.0
55263 20210731 신이문 4313.0
55264 20210731 용두(동대문구청) 1364.0
55265 20210731 신정네거리 5383.0
55266 rows × 3 columns
2.3. loc과 iloc을 활용한 관측치/변수 선택
loc은 행 이름(index)과 열 이름(column)으로 데이터에서 일부를 선택하고, iloc은 정수(integer) 형식의 행 번호, 열 번호를 활용
두 방법 모두 리스트[ ]나 슬라이스:를 활용한 방법을 지원합니다
실습을 위해 원본데이터를 복제하고 부분선택 하기
df_ins2 = df_ins.copy()[0:10]
df_ins2
>>>
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
5 31 female 25.740 0 no southeast 3756.62160
6 46 female 33.440 1 no southeast 8240.58960
7 37 female 27.740 3 no northwest 7281.50560
8 37 male 29.830 2 no northeast 6406.41070
9 60 female 25.840 0 no northwest 28923.13692
실습을 위해 인덱스를 별도로 지정하기
df_ins2['idx'] = list(range(101, 111))
df_ins2.set_index('idx', inplace=True)
df_ins2
>>>
age sex bmi children smoker region charges
idx
101 19 female 27.900 0 yes southwest 16884.92400
102 18 male 33.770 1 no southeast 1725.55230
103 28 male 33.000 3 no southeast 4449.46200
104 33 male 22.705 0 no northwest 21984.47061
105 32 male 28.880 0 no northwest 3866.85520
106 31 female 25.740 0 no southeast 3756.62160
107 46 female 33.440 1 no southeast 8240.58960
108 37 female 27.740 3 no northwest 7281.50560
109 37 male 29.830 2 no northeast 6406.41070
110 60 female 25.840 0 no northwest 28923.13692
2.3.1. loc을 활용한 부분 선택
loc은 실제로 눈에 보이는 index와 column을 활용
df_ins2.loc[101]
>>>
age 19
sex female
bmi 27.9
children 0
smoker yes
region southwest
charges 16884.924
Name: 101, dtype: object
-------------------------------------------------------------------------------------------------
df_ins2.loc[[101, 103]]
>>>
age sex bmi children smoker region charges
idx
101 19 female 27.9 0 yes southwest 16884.924
103 28 male 33.0 3 no southeast 4449.462
-------------------------------------------------------------------------------------------------
df_ins2.loc[101:103]
>>>
age sex bmi children smoker region charges
idx
101 19 female 27.90 0 yes southwest 16884.9240
102 18 male 33.77 1 no southeast 1725.5523
103 28 male 33.00 3 no southeast 4449.4620
-------------------------------------------------------------------------------------------------
df_ins2.loc[101:103, 'smoker']
>>>
idx
101 yes
102 no
103 no
Name: smoker, dtype: object
변수이름 리스트 활용가능
df_ins2.loc[101:103, ['smoker','region']]
>>>
smoker region
idx
101 yes southwest
102 no southeast
103 no southeast
변수이름 슬라이스 :를 활용가능
df_ins2.loc[101:103, 'smoker':'charges']\
>>>
smoker region charges
idx
101 yes southwest 16884.9240
102 no southeast 1725.5523
103 no southeast 4449.4620
모든 관측치 선택할 때는 :
df_ins2.loc[:, 'smoker':'charges']
>>>
smoker region charges
idx
101 yes southwest 16884.92400
102 no southeast 1725.55230
103 no southeast 4449.46200
104 no northwest 21984.47061
105 no northwest 3866.85520
106 no southeast 3756.62160
107 no southeast 8240.58960
108 no northwest 7281.50560
109 no northeast 6406.41070
110 no northwest 28923.13692
2.2.2. iloc을 활용한 부분 선택
iloc은 이름과 상관없이 정수로 표현한 위치, 번호를 활용하며 리스트나 슬라이스 활용 방법은 loc과 동일
display(df_ins2)
df_ins2.iloc[0:3, [0,3,4]]
>>>
age children smoker
idx
101 19 0 yes
102 18 1 no
103 28 3 no
[실습]
- df_pr에서 index 기준 '3'의 'Weight' 확인하기
- df_pr에서 index 기준 '11~15'의 'Age'부터 'Exercise'까지 선택하기
- df_pr에서 첫번째 ~ 다섯번째 관측치와 다섯번째 ~ 열번째 변수 선택하기
data 폴더 내 PulseRate.csv 파일을 df_dr에 저장한 후 아래의 결과를 확인하시오
df_pr = pd.read_csv("data/PulseRates.csv")
df_pr
>>>
Height Weight Age Gender Smokes Alcohol Exercise Ran Pulse1 Pulse2 Year
0 173 57.0 18 2 2 1 2 2 86.0 88.0 93
1 179 58.0 19 2 2 1 2 1 82.0 150.0 93
2 167 62.0 18 2 2 1 1 1 96.0 176.0 93
3 195 84.0 18 1 2 1 1 2 71.0 73.0 93
4 173 64.0 18 2 2 1 3 2 90.0 88.0 93
... ... ... ... ... ... ... ... ... ... ... ...
105 93 27.0 19 2 2 2 3 2 119.0 120.0 98
106 161 43.0 19 2 2 2 3 2 90.0 89.0 98
107 182 60.0 22 1 2 1 3 2 86.0 84.0 98
108 170 65.0 18 1 2 1 1 2 69.0 64.0 98
109 185 85.0 19 1 2 1 2 2 75.0 68.0 98
110 rows × 11 columns
----------------------------------------------------------------------------------------------
df_pr.iloc[3, 1]
>>> 84.0
----------------------------------------------------------------------------------------------
df_pr.iloc[11:16, 2:7]
>>>
Age Gender Smokes Alcohol Exercise
11 19 1 2 2 3
12 22 1 1 1 2
13 18 1 2 1 1
14 18 1 2 1 2
15 22 1 2 1 3
----------------------------------------------------------------------------------------------
#display(df_ins2)
df_pr.iloc[0:5, 5:11]
>>>
Alcohol Exercise Ran Pulse1 Pulse2 Year
0 1 2 2 86.0 88.0 93
1 1 2 1 82.0 150.0 93
2 1 1 1 96.0 176.0 93
3 1 1 2 71.0 73.0 93
4 1 3 2 90.0 88.0 93
오늘 배운 내용은 여기까지 입니다.
주말 잘 보내고 잘 쉬고 월요일에 돌아오겠습니다~~
'ABC부트캠프' 카테고리의 다른 글
[6일차] ABC 부트캠프 : 파이썬프로그래밍4 (24.07.11) (1) | 2024.07.12 |
---|---|
[5일차] ABC 부트캠프 : 파이썬프로그래밍3 (24.07.10) (1) | 2024.07.12 |
[4일차] ABC 부트캠프 : 파이썬프로그래밍2 (24.07.09) (0) | 2024.07.10 |
[3일차] ABC 부트캠프 : 파이썬프로그래밍1 (24.07.08) (0) | 2024.07.09 |
[2일차] ABC 부트캠프 : ESG 포럼&세미나 (24.07.05) (0) | 2024.07.08 |