본문 바로가기
ABC부트캠프

[7일차] ABC 부트캠프 : Pandas 기초, 데이터 전처리 기초 (24.07.12)

by 나무거나 2024. 7. 14.
728x90

#ABC부트캠프 #유클리드소프트 #고용노동부 #대한상공회의소 #미래내일일경험사업 #인공지능 #파이썬 #머신러닝 #딥러닝

 

오늘은 4일간의 파이썬 기초를 끝내고 데이터 처리를 위한 판다스(Pandas)와 데이터 전처리 기초를 배워 보았습니다.

판다스의 기초부터 설명하고 전처리에서 사용하는 방법을 알려드리도록 하겠습니다.

 

먼저 판다스란 무엇일까요?

판다스(Pandas)는 파이썬에서 데이터 조작과 분석을 위한 강력한 오픈 소스 라이브러리입니다. 판다스는 다양한 데이터 구조와 조작 도구를 제공하여, 구조화된 데이터를 효율적으로 처리하고 분석하는 데 매우 유용합니다.

주요 기능

  1. 데이터 구조
    • Series: 일차원 배열과 같은 데이터 구조로, 인덱스를 갖는 데이터의 집합입니다.
    • DataFrame: 이차원 배열과 같은 데이터 구조로, 행과 열로 구성되며, 다양한 유형의 데이터를 포함할 수 있습니다.
  2. 데이터 불러오기 및 저장
    • CSV, Excel, SQL, JSON 등 다양한 파일 형식에서 데이터를 쉽게 불러오고 저장할 수 있습니다.
  3. 데이터 탐색 및 조작
    • 데이터 조회: head(), tail(), info(), describe() 등을 사용하여 데이터의 개요를 파악할 수 있습니다.
    • 데이터 선택: loc 및 iloc 인덱서를 사용하여 데이터의 특정 부분을 선택할 수 있습니다.
  4. 데이터 정리
    • 결측값 처리: dropna(), fillna() 등을 사용하여 결측값을 처리할 수 있습니다.
    • 데이터 정렬: sort_values()를 사용하여 데이터를 정렬할 수 있습니다.
    • 중복 제거: drop_duplicates()를 사용하여 중복된 데이터를 제거할 수 있습니다.
  5. 데이터 변환
    • 데이터 프레임 합치기: merge(), concat() 등을 사용하여 데이터를 병합할 수 있습니다.
    • 그룹화 및 집계: groupby()와 agg()를 사용하여 데이터를 그룹화하고 요약 통계를 계산할 수 있습니다.
  6. 시계열 데이터 처리
    • 판다스는 시계열 데이터의 변환, 조작, 분석을 위한 다양한 기능을 제공합니다.

판다스의 장점

  • 강력한 데이터 처리 기능: 다양한 형식의 데이터를 쉽게 불러오고 조작할 수 있습니다.
  • 유연한 데이터 구조: 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. 데이터 수집
  2. 데이터 이해
  3. 데이터 정제
    1. 결측값 처리
    2. 이상치 처리
    3. 중복 데이터 제거
  4. 데이터 변환
    1. 데이터 정규화/표준화 : 데이터의 범위를 일정하게 맞춥니다.
    2. 인코딩 : 범주형 데이터를 숫자로 변환합니다.
  5. 특성 선택
  6. 데이터 분할
  7. 데이터 증강
  8. 데이터 저장

등의 순서로 진행 됩니다.

 

오늘 저희가 진행한 내용은 데이터 결합 및 부분 선택 입니다.

시작해보죠

 

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

 

[실습] 데이터 결합 및 인덱스 초기화

출처 : 서울시 지하철 호선별 역별 승하차 인원수

  1. data폴더의 CARD_SUBWAY_MONTH_로 시작하는 3개 데이터 확인하기
  1. 1.의 데이터를 각각 불러와서 저장하고, pd.concat()으로 행 결합하기(encoding='CP949' 활용)
  1. 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

[실습] 데이터 결합

  1. data폴더의 production.csv를 불러와서 df_pd 로 저장하기
  2. data폴더의 weather.csv를 불러와서 df_wt 로 저장하기
  3. 두 데이터를 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

[실습]

  1. 아래의 명령어를 실행해서 df_subway 데이터 생성하기
  2. .columns 변수(속성)를 활용해서 변수이름 확인하기
  3. 슬라이스를 활용하여 11~15번째 관측치(행) 선택하기
  4. '사용일자', '역명', '하차총승객수' 세 변수(열) 선택하기
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

[실습]

  1. df_pr에서 index 기준 '3'의 'Weight' 확인하기
  2. df_pr에서 index 기준 '11~15'의 'Age'부터 'Exercise'까지 선택하기
  3. 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

 

오늘 배운 내용은 여기까지 입니다.

주말 잘 보내고 잘 쉬고 월요일에 돌아오겠습니다~~

728x90