2 분 소요

데이터 프레임 인덱스

인덱스 설정과 제거

데이터 프레임에서 인덱스는 성능과도 관련이 있는 요소이므로 상황에 맞게 설계하며 조작할 수 있어야 한다.

우선 데이터셋을 만들고 다양한 조작법을 알아보자.

import pandas as pd
import numpy as np

list1 = ['A','B','C','D','E']
list2 = [4,5,3,6,9]
list3 = [0.66,0.77,0.88,0.99,1.11]
list4 = ['홍길동','윤길동','이길동','박길동','김길동',]

df = pd.DataFrame({'칼럼1':list1, '칼럼2':list2,'칼럼3': list3 ,'칼럼4':list4})


df
칼럼1 칼럼2 칼럼3 칼럼4
0 A 4 0.66 홍길동
1 B 5 0.77 윤길동
2 C 3 0.88 이길동
3 D 6 0.99 박길동
4 E 9 1.11 김길동

set_index()


set_index() 함수를 통해 기존의 행 인덱스를 제거하고 특정 칼럼을 인덱스로 변경할 수 있다.

df2=df.set_index('칼럼1')

df2
칼럼2 칼럼3 칼럼4
칼럼1
A 4 0.66 홍길동
B 5 0.77 윤길동
C 3 0.88 이길동
D 6 0.99 박길동
E 9 1.11 김길동
df2.index
Index(['A', 'B', 'C', 'D', 'E'], dtype='object', name='칼럼1')
df2.loc['A':'D']
칼럼2 칼럼3 칼럼4
칼럼1
A 4 0.66 홍길동
B 5 0.77 윤길동
C 3 0.88 이길동
D 6 0.99 박길동

set_index() 를 통해 기존의 0,1,2,3,4 로 이루어진 행 인덱스는 삭제하고 칼럼1이 인덱스로 바뀌었다.
index name은 기존의 칼럼명을 따라가게 된다.
기존 인덱스가 사라졌으므로 loc로 데이터를 인덱싱할 때에도 바뀐 칼럼 A의 값으로 데이터로 인덱싱 해야 한다.


reset_index()

reset_index() 함수를 통해 기존의 인덱스를 제거 혹은 칼럼화 시키고, 행을 기준으로 0 부터 시작하는 일반적인 정수형 인덱스를 추가할 수 있다.

df2.reset_index()
칼럼1 칼럼2 칼럼3 칼럼4
0 A 4 0.66 홍길동
1 B 5 0.77 윤길동
2 C 3 0.88 이길동
3 D 6 0.99 박길동
4 E 9 1.11 김길동

만약 drop=Ture 값을 준다면 기존 인덱스 였던 열은 칼럼으로 돌아가는 것이 아니라 삭제 된다.

df2.reset_index(drop=True)
칼럼2 칼럼3 칼럼4
0 4 0.66 홍길동
1 5 0.77 윤길동
2 3 0.88 이길동
3 6 0.99 박길동
4 9 1.11 김길동


다중 인덱스


행이나 열에 여러 계층을 가지는 다중 인덱스를 설정 할 수 있다.

생성


df3 = pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], columns=[['A','A','B','B'],['칼럼1','칼럼2','칼럼3','칼럼4']])


df3
A B
칼럼1 칼럼2 칼럼3 칼럼4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

columns = 에 다중 리스트 형태로 인덱스를 넣어주면 된다.


인덱스 이름 추가

df3.columns.names= ['이름1','이름2']
df3
이름1 A B
이름2 칼럼1 칼럼2 칼럼3 칼럼4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

마찬가지로 칼럼 인덱스 뿐만 아니라 행 인덱스도 다중으로 생성하고 이름을 설정할 수 있다.

df4 = pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]],
                   columns=[['A','A','B','B'],['칼럼1','칼럼2','칼럼3','칼럼4']],
                   index=[[1,1,2,2],['하나','둘','셋','넷']])

df4.columns.names = ['이름1','이름2']
df4.index.names = ['인덱스1', '인덱스2']
df4
이름1 A B
이름2 칼럼1 칼럼2 칼럼3 칼럼4
인덱스1 인덱스2
1 하나 1 2 3 4
5 6 7 8
2 9 10 11 12
13 14 15 16

다중 인덱스 인덱싱


인덱스가 다중으로 있는 경우 인덱스 값을 튜플의 형태로 입력하여야 한다.

df4.loc[(1,'하나'),('A','칼럼2')]
2
df4[('A','칼럼2')]=100

df4
이름1 A B
이름2 칼럼1 칼럼2 칼럼3 칼럼4
인덱스1 인덱스2
1 하나 1 100 3 4
5 100 7 8
2 9 100 11 12
13 100 15 16
df4.A
이름2 칼럼1 칼럼2
인덱스1 인덱스2
1 하나 1 100
5 100
2 9 100
13 100
df4.loc[1]['A']
이름2 칼럼1 칼럼2
인덱스2
하나 1 100
5 100

주의할 점은 iloc 함수에서는 튜플 형태로 다중 인덱싱을 사용할 수 없다.

댓글남기기