카테고리 없음

-2- 보스턴 데이터셋을 통하여 판다스 loc,iloc 알아보기

동동 2022. 5. 9. 00:18
728x90

안녕하세요~

1. 데이터 로딩

보스턴 주택 가격에 관련된 데이터셋은 14개의 변수(열)로 구성되어있습니다. 각 열은 주택의 속성을 나타내는 Feature나타냅니다. 예를 들면 주택의 크기나 동네 범죄율, 평균 연령 등이 있겠네요. 각 행은 개별 주택을 말합니다. 즉 행만큼 주택의 개수가 있다고 생각하시면 됩니다.
정리하자면 보스턴 데이터셋은 하나의 행이 하나의 샘플(주택)을 나타내고, 각 열에 맞춰 해당하는 데이터가 입력되어 있습니다.

import numpy as np
import pandas as pd
# 싸이킷런에서 제공하는 데이터셋을 가져오겠습니다.
from sklearn import datasets

dataset = datasets.load_boston() #데이터셋 에 대한 설명이 적혀있습니다. 자세한건 다음 포스팅에서 다루도록 하겠습니다.

df = pd.DataFrame(dataset['data']) # 우선 데이터 형태만 가져오겠습니다.
df.shpae
>>	 (506, 13)

 

데이터프레임은 위와같은 형태로 구성되어 있습니다.

컬럼 이름이 없어서 어떤 데이턴지 잘 모르겠네요! 불편하니 컬럼을 가져와보겠습니다.

df = pd.DataFrame(dataset['data'], columns=dataset['feature_names'])
df.head()

>> 	CRIM	ZN	INDUS	CHAS	NOX	RM	AGE	DIS	RAD	TAX	PTRATIO	B	LSTAT
>> 0	0.00632	18.0	2.31	0.0	0.538	6.575	65.2	4.0900	1.0	296.0	15.3	396.90	4.98
>> 1	0.02731	0.0	7.07	0.0	0.469	6.421	78.9	4.9671	2.0	242.0	17.8	396.90	9.14
>> 2	0.02729	0.0	7.07	0.0	0.469	7.185	61.1	4.9671	2.0	242.0	17.8	392.83	4.03
>> 3	0.03237	0.0	2.18	0.0	0.458	6.998	45.8	6.0622	3.0	222.0	18.7	394.63	2.94
>> 4	0.06905	0.0	2.18	0.0	0.458	7.147	54.2	6.0622	3.0	222.0	18.7	396.90	5.33

이제부터 이 데이터셋을 필요한 부분만 가져오는 판다스 명령어를 사용해보겠습니다 :)

2-1. 단순 index에 대한 범위선택

 

df[:3] 
df.head(3)
# 둘 중 편한 방법으로 사용가능합니다.


>> 	CRIM	ZN	INDUS	CHAS	NOX	RM	AGE	DIS	RAD	TAX	PTRATIO	B	LSTAT
>> 0	0.00632	18.0	2.31	0.0	0.538	6.575	65.2	4.0900	1.0	296.0	15.3	396.90	4.98
>> 1	0.02731	0.0	7.07	0.0	0.469	6.421	78.9	4.9671	2.0	242.0	17.8	396.90	9.14
>> 2	0.02729	0.0	7.07	0.0	0.469	7.185	61.1	4.9671	2.0	242.0	17.8	392.83	4.03

 

2-2. loc (자주 사용하니 꼭 알아둬야 합니다)

df.loc[:, 'CRIM'] # 행은 다 가지고오고, 열은 'CRIM'만 !

df.loc[3:5, 'CRIM'] # 행은 3~5까지만, 열은 'CRIM'만 가져오기!

df.loc[3:5, 'CRIM':'AGE'] # 행은 3~5까지만, 열은 'CRIM'~'AGE'까지 가져오기!

2-3. iloc (index + loc, Position으로 색인)

df.iloc[:, [0,2]]

>> 		CRIM	INDUS
>> 	0	0.00632	2.31
>> 	1	0.02731	7.07
>> 	2	0.02729	7.07
----------------------------------------------
df.loc[:, [0,2]]
>> 	에러발생!! why? loc는 인덱스 기준이 아니기 때문!

* iloc와 loc의 중요 특징

중요 포인트 입니다!

3. Boolean Indexing - 조건을 활용한 색인

# 먼저 나이의 열을 기준으로 50세가 넘을 경우 True, 아닐경우 False로 표현해보겠습니다.
df['AGE']>50


>> 	0       True
>> 	1       True
>> 	2       True
>> 	3      False
>> 	4       True
>> 	       ...  
>> 	501     True
>> 	502     True
>> 	503     True
>> 	504     True
>> 	505     True
>> 	Name: AGE, Length: 506, dtype: bool

위의 True, False를 가지고 True 인 값만 가져오도록 해보겠습니다.

# df[ 참/거짓 조건 입력]
df[ df['AGE']>50 ]


>> 	CRIM	ZN	INDUS	CHAS	NOX	RM	AGE	DIS	RAD	TAX	PTRATIO	B	LSTAT
>> 0	0.00632	18.0	2.31	0.0	0.538	6.575	65.2	4.0900	1.0	296.0	15.3	396.90	4.98
>> 1	0.02731	0.0	7.07	0.0	0.469	6.421	78.9	4.9671	2.0	242.0	17.8	396.90	9.14
>> 2	0.02729	0.0	7.07	0.0	0.469	7.185	61.1	4.9671	2.0	242.0	17.8	392.83	4.03
>> 4	0.06905	0.0	2.18	0.0	0.458	7.147	54.2	6.0622	3.0	222.0	18.7	396.90	5.33
>> 5	0.02985	0.0	2.18	0.0	0.458	6.430	58.7	6.0622	3.0	222.0	18.7	394.12	5.21
>> ...	...	...	...	...	...	...	...	...	...	...	...	...	...
>> 501	0.06263	0.0	11.93	0.0	0.573	6.593	69.1	2.4786	1.0	273.0	21.0	391.99	9.67
>> 502	0.04527	0.0	11.93	0.0	0.573	6.120	76.7	2.2875	1.0	273.0	21.0	396.90	9.08
>> 503	0.06076	0.0	11.93	0.0	0.573	6.976	91.0	2.1675	1.0	273.0	21.0	396.90	5.64
>> 504	0.10959	0.0	11.93	0.0	0.573	6.794	89.3	2.3889	1.0	273.0	21.0	393.45	6.48
>> 505	0.04741	0.0	11.93	0.0	0.573	6.030	80.8	2.5050	1.0	273.0	21.0	396.90	7.88
>> 359 rows × 13 columns

나이가 50세를 넘는 사람들만 추출해봤습니다. 하지만 너무 많은 열이 출력되어 보기가 좀 어렵군요
이럴 땐 아래와 같이 조건을 넣어주면 됩니다.

해결 방법1. 출력 컬럼 이름을 넣기

df [ df['AGE']>50 ]['RM']

>> 0      6.575
>> 1      6.421
>> 2      7.185
>> 4      7.147
>> 5      6.430
>>        ...  
>> 501    6.593
>> 502    6.120
>> 503    6.976
>> 504    6.794
>> 505    6.030
>> Name: RM, Length: 359, dtype: float64

해결 방법2. loc를 사용한다!

# 한개의 열만 가져오기
df.loc[df['AGE']>50, 'CRIM']

>> 0      0.00632
>> 1      0.02731
>> 2      0.02729
>> 4      0.06905
>> 5      0.02985
>>         ...   
>> 501    0.06263
>> 502    0.04527
>> 503    0.06076
>> 504    0.10959
>> 505    0.04741
>> Name: CRIM, Length: 359, dtype: float64
# 범위로 열 가져오기
df.loc[df['AGE']>50, 'CRIM':'RM']


>> 	 CRIM	ZN	INDUS	CHAS	NOX	RM
>>  0	0.00632	18.0	2.31	0.0	0.538	6.575
>>  1	0.02731	0.0	7.07	0.0	0.469	6.421
>>  2	0.02729	0.0	7.07	0.0	0.469	7.185
>>  4	0.06905	0.0	2.18	0.0	0.458	7.147
>>  5	0.02985	0.0	2.18	0.0	0.458	6.430
>>  ...	...	...	...	...	...	...
>>  501	0.06263	0.0	11.93	0.0	0.573	6.593
>>  502	0.04527	0.0	11.93	0.0	0.573	6.120
>>  503	0.06076	0.0	11.93	0.0	0.573	6.976
>>  504	0.10959	0.0	11.93	0.0	0.573	6.794
>>  505	0.04741	0.0	11.93	0.0	0.573	6.030
>>  359 rows × 6 columns
# 특정 열만 가져오기
df.loc[df['AGE']>50, ['CRIM','CHAS'] ]


>>  	CRIM	CHAS
>>  0	0.00632	0.0
>>  1	0.02731	0.0
>>  2	0.02729	0.0
>>  4	0.06905	0.0
>>  5	0.02985	0.0
>>  ...	...	...
>>  501	0.06263	0.0
>>  502	0.04527	0.0
>>  503	0.06076	0.0
>>  504	0.10959	0.0
>>  505	0.04741	0.0
>>  359 rows × 2 columns
728x90