세상을 바꾸는 데이터

[Pandas] 판다스 - 데이터 선택 및 필터링 (indexing) 본문

ML/Pandas

[Pandas] 판다스 - 데이터 선택 및 필터링 (indexing)

Industriousness 2022. 1. 24. 19:00

DataFrame에서 데이터를 선택하고 필터링하는 방법에 대해 알아보자.

import numpy as np
import pandas as pd

 


데이터 선택에서 numpy와 pandas 차이점

데이터프레임 인덱싱

 

넘파이와 DataFrame 간 데이터 선택에서 가장 유의해야 할 부분은 [ ] 연산자이다. 넘파이에서 [ ]연산자는 행의 위치, 열의 위치, 슬라이싱 범위 등을 지정해 데이터를 가져올 수 있었다. 반면 DataFrame 뒤에 있는 [ ] 안에 들어갈 수 있는 것은 칼럼 명 문자(또는 칼럼 명 리스트 객체), 인덱스로 변환 가능한 표현식이다. 

 

titanic_df = pd.read_csv('titanic_train.csv')
print('단일 컬럼 데이터 추출:\n', titanic_df[ 'Pclass' ].head(3))
print('\n여러 컬럼들의 데이터 추출:\n', titanic_df[ ['Survived', 'Pclass'] ].head(3))

 

[Output]

 


명칭 기반 인덱싱과 위치 기반 인덱싱의 구분

명칭(Label) 기반 인덱싱칼럼의 명칭을 기반으로 위치를 지정하는 방식이다. '칼럼명'과 같이 명칭으로 열 위치를 지정하는 방식이다. DataFrame.loc[ ]를 이용한다.

위치(Position) 기반 인덱싱은 0을 출발점으로 하는 가로축, 세로축 좌표 기반의 행과 열 위치를 기반으로 데이터를 지정한다. 따라서 행, 열 값으로 정수가 입력된다. DataFrame.iloc[ ]를 이용한다. 

 loc와 iloc를 사용할 때의 차이점

 


위치 기반 인덱싱 DataFrame iloc[ ] 연산자

 

titanic_df.head(5) # 타이타닉 데이터 개략적 확인

 

[Output]

 

  • DataFrame.iloc[ ] 

iloc[ ]는 위치 기반 인덱싱만 허용하기 때문에 행과 열 값으로 integer 또는 integer형의 슬라이싱, 팬시 리스트 값, 불린 인덱싱 등을 입력해야 한다. DataFrame인 titanic_df의 첫 번째 행, 첫 번째 열의 데이터를 추출하고자 한다면 다음과 같이 코드를 작성하면 된다.

titanic_df.iloc[0, 0] # PassengerId 칼럼 1행에 있는 1값 출력

 

다음과 같이 iloc에서 '칼럼 명' 명칭을 이용하면 오류를 발생시킨다.

titanic_df.iloc[0, 'Pclass'] # 오류 발생
titanic_df.iloc['Ticket', 0] # 오류 발생

 


명칭 기반 인덱싱 DataFrame loc[ ] 연산자

  • DataFrame.loc[ ] 

loc[ ]는 명칭 기반으로 데이터를 추출한다. 행 위치에는 DataFrame index 값을, 열 위치는 칼럼 명을 입력해준다.

 

다음은 인덱스 값이 2인 행의 칼럼 명이 'Pclass'인 데이터를 추출한 것이다.

여기서 index가 숫자형일 수도 있기 때문에 명칭 기반이라고 무조건 문자열을 입력하는 것은 아니다.

titanic_df.loc[2, 'Pclass'] # index값이 2인 행의 칼럼 명이 'Pclass'인 데이터 추출
# 결과값: 3

 


iloc와 loc 차이점 정리

명칭 기반 인덱싱(loc): DataFrame의 인덱스나 칼럼명으로 데이터에 접근하는 것

위치기반 인덱싱(iloc): 0부터 시작하는 행, 열의 위치 좌표에만 의존하는 것 

※ 주의 ※   

DataFrame의 인덱스가 숫자형일 경우 행 위치에 있는 숫자는 위치 기반 인덱싱이 아니라 명칭 기반 인덱싱의 DataFrame 인덱스를 가리킨다. 

 


불린 인덱싱

불린 인덱싱은 명칭 or 위치 기반 인덱싱과 상관없이 조건식을 [ ] 안에 기입하여 필터링을 수행할 수 있는 매우 편리한 데이터 필터링 방식이다. 불린 인덱싱은 [ ], loc[ ]에서 공통으로 지원하지만 iloc[ ]는 정수형 값이 아닌 불린 값에 대해서는 지원하지 않는다.

 

다음은 titanic호 탑승자 중 나이가 10살 미만인 데이터를 추출하는 방법이다.

titanic_df = pd.read_csv('titanic_train.csv')
titanic_boolean = titanic_df[titanic_df['Age'] < 10]
print(titanic_boolean)

 

[Output]

타이타닉 탑승자 중 Age가 10미만인 데이터셋 추출

 

  • 원하는 칼럼 명만 별도로 추출하기

 

다음은 10세 미만인 승객의 나이와 이름 칼럼만 추출한다.

titanic_df_age = titanic_df[titanic_df['Age']< 10][['Name', 'Age']].head(3)
print(titanic_df_age)

 

[Output]

Age가 10미만인 데이터 중 Name, Age 칼럼만 뽑아 3행 출력

 

  • 여러 개의 조건식을 이용해 데이터 추출하기

생존자이면서 선실등급이 3등급이고, 나이가 20살 미만이며 성별이 여성인 승객 Name과 Ticket 칼럼명만 별도로 추출해보자.

조건 1 : Survived = 1

조건 2: Pclass = 3

조건 3: Age < 20

조건 4: Sex = 'female'

titanic_select = titanic_df[(titanic_df['Survived'] == 1) & (titanic_df['Pclass'] == 3) & 
                 (titanic_df['Age'] < 20) & (titanic_df['Sex'] == 'female')][['Name', 'Ticket']] 
print(titanic_select)

 

[Output]

 

데이터프레임 인덱싱 방법

 

 

Reference


https://www.thedataincubator.com/blog/2018/02/21/numpy-and-pandas/

https://towardsdatascience.com/how-to-use-loc-and-iloc-for-selecting-data-in-pandas-bd09cb4c3d79

https://github.com/chulminkw/PerfectGuide

https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%99%84%EB%B2%BD%EA%B0%80%EC%9D%B4%EB%93%9C

 

 

 

 

 

728x90
반응형
Comments