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