플로라도의 data workout

판다스 데이터 프레임 인덱싱 유의점들 본문

기초 노트/Python

판다스 데이터 프레임 인덱싱 유의점들

플로라도 2024. 5. 7. 23:38

판다스 데이터프레임의 인덱싱은 크게 세가지 방법이 있다.

 

1. ' [ ] ' 연산자

2. iloc '위치 기반 선택'

3. loc '라벨 기반 선택'

 

 

1.  '[ ]' 연산자  @ka : 칼럼지정 연산자, 행 슬라이싱, 불리언 인덱싱

데이터프레임에 ' [ ] ' 연산자를 적용, df ['column_name'] 와 같이 사용하는 것은 기본적으로 여느 다른 클래스와 마찬가지로 매직 메서드인 '__getitem__'에 의해 구현되어 있다.

 

- 열 선택 

df['column_name']

 

- 슬라이싱을 통한 행 선택

df[2:5]

 

이때 유의점1은 df[3] 과 같이 단일 정수값으로 행을 선택하려고 들면 에러가 난다는 점이다. 데이터 프레임에서 ' [ ] ' 연산자는 '칼럼 지정 연산자'로 작동하며, 열 이름 자체가 '3'이 아닌 이상 이는 오류를 반환한다.

 

이때 유의점2은,  '[:]'를 통해 전체 칼럼을 지정하면 기존의 데이터 프레임이 아닌, 데이터프레임 객체의 copy본을 반환한다는 점이다. 

 

따라서 통상 데이터 분석 작업시에 raw data를 저장해두고 싶을때에

raw_df = train[:]

 

과 같이 주로 사용한다.

 

 

 

- 불리언 인덱싱

df[df['column_name'] > value]

df[df['column_name'] > value]['age']  # 추가적인 인덱싱 연산 사용

 

유의점3

 

아래와 같이 구성된 데이터프레임 객체 'train'은 첫행의 인덱스 값은 0이 아닌 1번 부터 시작하며 차례로 정렬되어 있는 것이 아니라 인덱스가 뒤섞여있는 모습이다. 

 

이때 train 데이터프레임에서 다음과 같은 코드를 입력하면

train.image_path[0]  # 칼럼의 속성형식 접근-> train.image_path는 시리즈 객체이며 [0]은 첫번째 인덱스를 가져온다

 

 

위와 같이 0번 인덱스에 해당하는 정보를 가져오게 된다. 

그런데 분명 train의 첫번째 행은 1번 인덱스로 시작하는데도 0번 인덱스를 가져오는 모습을 확인할 수 있었다.

 

위와 같이 확인한 결과 iloc의 위치 기반 인덱스로는 30425번에 해당하지만, 30425번째 행의 index객체의 value가 0임으로  train.image_path[0]은 index의 값이 0인 행을 가져오는 것을 알 수 있었다.

 

2. iloc '위치' 기반 선택

 

(작성중)

 

 

iloc는 기본적으로

df.iloc[row_index,column_index]

 

3. loc '라벨' 기반 선택

 

(작성중)

 

df.loc[row_label, column_label]

 

 

 

 

그렇다면 세 방법중 어느 방법을 써야하는가 ?

필자는 세 방법중 loc기반 인덱싱 방식을 선호한다. 

1번의 방법인 '[ ]' 연산의 경우에는 iloc와 loc 인덱싱 대비 제한적인 기능만을 제공하며,

데이터를 처리하다 보면 행이나 열의 순서는 뒤바뀔 수 있지만, 열의 이름자체는 잘 바뀌지 않기 때문에 iloc보다 loc인덱싱을 선호하게 되었다.