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판)' 책을 기반으로 작성하였습니다.
'[Capstone Study] 머신러닝 완벽 가이드' 카테고리의 다른 글
[머신러닝] 섹션 1.5 사이킷런 (1) (0) | 2023.11.06 |
---|---|
[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스 (4) (0) | 2023.11.06 |
[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스 (2) (0) | 2023.11.06 |
[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스 (1) (0) | 2023.11.06 |
[머신러닝] 섹션 1.3 넘파이 (2) (0) | 2023.11.06 |