[Capstone Study] 머신러닝 완벽 가이드

[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스 (3)

wlalsu_u 2023. 11. 6. 01:56

https://wlalsu.tistory.com/121

 

[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스(2)

https://wlalsu.tistory.com/120 [머신러닝] 섹션 1.4 데이터 핸들링 - 판다스(1) 1.4.1 판다스(Pandas) 란? 판다스는 기존의 불편한 분석용 데이터 툴을 개선하기 위해, 분석 전문가인 '웨스 매키니'가 개발하였

wlalsu.tistory.com

 

 

 

 

 

 

 

 

1.4.6 Index 객체

 

 

 

 

 

판다스의 Index 객체는 DataFrame 과 Series의 레코드를

 

고유하게 식별하는 역할을 수행한다.

 

(RDBMS의 PK 값과 유사)

 

 

 

 

 

 

 

index

 

 

 

 

- (DataFrame/Series).index를 이용하여 Index 추출

 

- 반환된 Index 객체의 실제 값은 넘파이 1차원 ndarray

 

- value 속성으로 ndarray 값 확인 가능 

 

- 쉽게 변경할 수 없음

 

- 식별용으로 사용되므로, 실제 객체 연산 함수에 적용되지 않음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

만약 index 객에 array 값의 일부를 확인하고 싶다면

 

ndarray와 유사하게 단일 값 반환 또는 슬라이싱이 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이때 한 번 만들어진 DataFrame 이나 Series의 Index 객체는

 

함부로 변경할 수 없음을 유의하자!

 

 

 

 

 

실제로 첫번째 Index 값을 5로 바꾸려고 하는 경우 

 

오류가 발생하는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

또한 아래의 실습을 통해 Series 객체에 연산 함수를 적용할 때

 

연산에서는 제외되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

reset_index()

 

 

 

 

 

- 새롭게 인덱스를 연속 숫자 형으로 할당

 

- 기존 인덱스는 index 라는 새로운 칼럼명으로 추가됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

앞선 예제에서 Pclass의 경우 index가 연속된 숫자형이 아닌

 

Pclass 고유 값이 식별자 인덱스 역할을 하는 예제를 살펴보았다.

 

 

 

 

이때 rest_index를 사용하여 Pclass에 연속 숫자형 인덱스를 부여해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이때 객체 변수 타입을 확인해보면

 

기존 인덱스가 index 칼럼으로 추가되었으므로,

 

더 이상 Series가 아닌 DataFrame이 반환됨을 유의하자!

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.4.7 데이터 셀렉션 및 필터링

 

 

 

 

 

넘파이의 데이터 핸들링 기능은 데이터 분석용으로 사용하기에 불편한 부분이 많므로,

 

판다스는 이를 개선하여 보다 편리한 데이터 셀렉션 기능을 제공한다.

 

 

 

 

따라서 판다스의 데이터 셀렉션 및 필터링과

 

넘파이의 데이터 핸들링 방식을 혼동하기 쉽다.

 

 

 

 

넘파이 방식과의 비교를 바탕으로

 

판다스의 데이터 셀렉션 방식을 자세하게 알아보자.

 

 

 

 

 

 

 

DataFrame의 [ ] 연산자

 

 

 

 

 

- 넘파이의 [ ] : 행의 위치 / 열의 위치 / 슬라이싱 범위 지정

 

- DataFrame의 [ ] : 칼럼명 문자 / 인덱스로 변환 가능한 표현식 지정

 

- 따라서 [ ] 안에 숫자 값을 입력할 수 없음

 

- 단 인덱스 형태로 변환 가능한 표현식은 [ ] 안에 입력할 수 있음

 

- 즉 [ ] 는 칼럼만 지정할 수 있는 '칼럼 지정 연산자'

 

 

 

 

 

 

 

 

DataFrame 의 [ ] 안에 칼럼명을 입력하여

 

일부 칼럼 데이터를 추출하는 실습을 진행해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

titanic_df[0] 과 같이 열의 위치인 숫자를 입력하면

 

이는 칼럼명이 아니므로 오류를 발생시키는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

하지만 titanic[0:2] 와 같이

 

판다스의 인덱스 형태로 변환 가능한 표현식은

 

[ ] 내에 입력할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실행결과를 확인해보면

 

실제로 titanic_df 의 첫 2개의 데이터가 슬라이싱되어 반환되는 것을 확인할 수 있다.

 

 

 

 

 

또한 불린 인덱싱도 [ ] 안에 작성하여

 

원하는 데이터를 보다 쉽게 추출할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

실행 결과를 확인해보면

 

실제 Pclass 칼럼 값이 3인 데이터가 추출된 것을 확인할 수 있다.

 

 

 

 

 

 

[ 정리 ] 

1) DataFrame 의 [ ] 는 넘파이나 Series의 [ ]와 다름

2) [ ] 내에는 칼럼명을 입력하거나 불린 인덱싱의 용도로만 사용됨

3) 슬라이싱 연산으로 데이터를 추출하는 방식은 사용하지 않는 것이 좋음

 

 

 

 

 

 

 

 

 

DataFrame의 row 또는 column을 지정하여 인덱싱하는 방식으로는

 

iloc[ ] 과 loc[ ] 연산자가 있다.

 

이에 대해 하나씩 자세하게 알아보자.

 

 

 

 

 

 

 

 

DataFrame의 iloc[ ] 연산자

 

 

 

 

- 위치 기반 인덱싱 방식

 

- 행과 열의 위치를 0을 시작으로 하는 세로, 가로축 정수값으로 표현 

 

- iloc[행 위치 정수값, 열 위치 정수값]

 

- 슬라이싱과 팬시 인덱싱은 제공하지만, 불린 인덱싱은 제공하지 않음

 

- ( -1 ) 값을 입력하여 가장 마지막 열 데이터를 가져올 수 있음

 

 

 

 

 

 

 

먼저 one, two, three, four 문자열을 각각 인덱스 값으로 갖는

 

DataFrame을 아래와 같이 생성해주었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

여기서 iloc[ 0,0 ] 을 이용하여

 

첫번째 행의 첫번째 열데이터를 추출한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

만약 위치 기반 인덱싱 방식이 아닌

 

칼럼 명칭을 입력하는 경우

 

오류가 발생하는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

또한 iloc[ ] 연산은 열 위치에 -1을 입력하여

 

가장 마지막 데이터를 가져올 수 있다.

 

 

 

 

 

머신 러닝 학습 데이터에서 가장 마지막 칼럼이 타깃 값이 많으므로

 

이는 매우 유용하게 사용된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

[ 참고 ] 다양한 iloc[ ] 연산 유형


1) DataFrame.iloc[1,0] : 2행의 1열 위치의 단일 값 반환


2) DataFrame.iloc[0:2, [0,1] : 1~2행 범위의 1~2 열에 해당되는 DataFrame 반환


3) DataFrame.iloc[0:2, 0:3] : 1~2행 범위의 1~3 열에 해당되는 DataFrame 반환


4) DataFrame.iloc[ : ] : 전체 DataFrame 반환


5) DataFrame.iloc[ : , : ] : 전체 DataFrame 반환

 

 

 

 

 

 

 

DataFrame의 loc[ ] 연산자

 

 

 

 

- 명칭 기반 인덱싱 방식

 

- DataFrame의 인덱스 값으로 row, 칼럼의 명칭으로 column을 표현

 

- loc[인덱스값, 칼럼명]

 

- 슬라이싱 기호 ( : ) 를 이용하는 경우 (종료 값 - 1)이 아닌 종료 값까지를 포함

 

- 불린 인덱싱 가능

 

 

 

 

 

 

 

 

 

실제로 인덱스 값이 'one' 이고, 칼럼명이 'Name'인 데이터 값은

 

아래와 같이 추출할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

이때 일반적으로 인덱스 값은 0부터 시작하는 정수값이므로

 

행의 위치에 정수값을 입력하여 오류가 나기 쉽다!

 

이를 착각하지 않도록 유의하자!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

또한 loc[ ] 의 경우 명칭 기반 인덱싱으로, 

 

명칭 값이 숫자가 아닐 수 있다.

 

 

따라서 슬라이싱 기호 ( : ) 를 이용할 때

 

(종료 값 - 1) 까지가 아닌 (종료값) 도 포함하고 있음을 유의하자!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실제로 결과값을 확인해보면

 

위치 기반 슬라이싱의 경우 1개의 값만 반환하였지만,

 

명칭 기반 슬라이싱의 경우 2개의 값을 반환한 것을 확인할 수 있다.

 

 

 

 

 

 

 

[ 참고 ] 다양한 loc[ ] 연산 유형


1) DataFrame.loc['three','Name'] : 인덱스 값이 'three', 칼럼 값이 'Name'인 단일 값 반환


2) DataFrame.loc['one':'two', ['Name','Year'] : 인덱스 값이 one~two, 칼럼 값이 Name과 Year인 DataFrame 반환


3) DataFrame.loc[ : ] : 모든 데이터 값 반환


4) DataFrame.loc[ data_df.Year >= 2014 ] : Year 칼럼 값이 2014 이상인 모든 데이터를 불린 인덱싱으로 추출

 

 

 

 

 

 

 

 

불린 인덱싱

 

 

 

 

- 매우 편리한 데이터 필터링 방식

 

- [ ], loc[ ] 에서는 지원되지만, iloc[ ] 에서는 지원되지 않음

 

 

 

 

 

 

 

 

불린 인덱싱을 이용하여

 

앞선 타이타닉 예시에서 나이가 60세 이상인 승객 데이터를 추출해보자.

 

 

 

 

 

 

 

 

 

 

 

 

결과값을 확인해보면

 

Age 칼럼 값이 60 이상인 DataFrae이 반환된 것을 확인할 수 있다.

 

 

 

 

 

 

이번에는 60세 이상인 승객의 나이와 이름을 추출해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2개 이상의 칼럼을 추출하므로

 

위의 코드와 같이 [[]] 를 사용하면 Name 과 Age 값을 추출할 수 있다.

 

 

 

 

 

또한 나이가 60세 이상이고, 성실 등급이 1등급이며, 여성인 승객을 추출하기 위해서는

 

개별 조건을 ( )으로 묶고 복합 조건을 사용하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

[ 참고 ] 복합 조건 사용

1) and 조건 : & 

2) or 조건 : |

3) Not 조건 : ~

 

 

 

 

 

 

 

 

 

 

 

 

권철민 '파이썬 머신러닝 완벽 가이드 (개정2판)' 책을 기반으로 작성하였습니다.