[Pandas 기초] 인덱스 활용 및 정렬
업데이트:
개요
1. 특정 열을 행 인덱스로 설정 : set_index()
set_index()
함수는 데이터프레임을 먼저 불러온 후에, 특정 열을 인덱스로 설정할때 사용된다.
exam_data = {'이름' : ['서준','우현','인아'],
'수학' : [90,80,70],
'영어' : [98,89,95],
'음악' : [85,95,100],
'체육' : [100,90,90]}
df = pd.DataFrame(exam_data)
print(df)
print('\n')
ndf1 = df.set_index('이름') # '이름'열을 인덱스로 사용
print(ndf1)
print('\n')
ndf2 = ndf1.set_index(['음악']) # '음악'열을 인덱스로 사용
print(ndf2)
print('\n')
ndf3 = ndf1.set_index(['수학','음악']) # '수학','음악'열을 인덱스로 사용
print(ndf3)
[Output]
이름 수학 영어 음악 체육
0 서준 90 98 85 100
1 우현 80 89 95 90
2 인아 70 95 100 90
수학 영어 음악 체육
이름
서준 90 98 85 100
우현 80 89 95 90
인아 70 95 100 90
수학 영어 체육
음악
85 90 98 100
95 80 89 90
100 70 95 90
영어 체육
수학 음악
90 85 98 100
80 95 89 90
70 100 95 90
위에서 ‘이름’열을 먼저 인덱스로 설정하고 다시 ‘음악’열을 인덱스로 부여해줄때, 기존의 인덱스 열인 ‘이름’은 사라진다.
추가로 drop=True
옵션을 지정해주면 인덱스로 지정은 하되, 기존열을 남겨놓는다.
print(ndf1.set_index('음악', drop=False))
[Output]
수학 영어 음악 체육
음악
85 90 98 85 100
95 80 89 95 90
100 70 95 100 90
2. 행 인덱스 재배열 : reindex()
함수
우선 r0 r1 r2라는 인덱스를 가진 데이터프레임을 생성해보자.
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data, index = ['r0','r1','r2'])
print(df)
[Output]
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15
이제 reindex()
함수는 기존 데이터프레임의 행 인덱스를 기반으로 하지 인덱스자체를 바꿔주는 함수가 아니다.
여기서는 기존의 값이 없으면 NaN으로 채워준다.
new_index = ['r0','r1','r2','r3','r4']
ndf = df.reindex(new_index)
print(ndf)
[Output]
c0 c1 c2 c3 c4
r0 1.0 4.0 7.0 10.0 13.0
r1 2.0 5.0 8.0 11.0 14.0
r2 3.0 6.0 9.0 12.0 15.0
r3 NaN NaN NaN NaN NaN
r4 NaN NaN NaN NaN NaN
이 NaN을 0으로 채우려면 fill_value=0
옵션을 주면된다. 물론 0말고도 다른 값으로 채울 수 있다.
ndf = df.reindex(new_index, fill_value=0)
print(ndf)
[Output]
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15
r3 0 0 0 0 0
r4 0 0 0 0 0
아에 새로운 인덱스 지정한다면 당연히 모두 NaN값이다.
test = df.reindex(['s1','s2','s3'])
print(test)
[Output]
c0 c1 c2 c3 c4
s1 NaN NaN NaN NaN NaN
s2 NaN NaN NaN NaN NaN
s3 NaN NaN NaN NaN NaN
단순히 인덱스 명을 변경하고 싶다면 앞에서 배운 인덱스명 변경으로 간단히 하면된다.
3. 행 인덱스 초기화 : reset_index()
함수
아무래도 데이터프레임의 다양한 전처리 과정을 거치게 되면 인덱스가 뒤죽박죽인 경우가 많다. 이럴때 인덱스를 다시 처음부터 재배열 해주는 유용한 함수다.
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data, index = ['r0','r1','r2'])
print(df)
[Output]
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15
행인덱스를 정수형, 기본값인 0부터 시작하는 순서로 초기화해보자.
ndf = df.reset_index()
print(ndf)
[Output]
index c0 c1 c2 c3 c4
0 r0 1 4 7 10 13
1 r1 2 5 8 11 14
2 r2 3 6 9 12 15
기존의 인덱스는 첫번째열로 자동으로 삽입된다.
이럴때 drop=True
옵션을 주면 기존 인덱스를 버리고 재배열해준다.
또한 새로운 변수ndf에 넣지 않고 inplace=True
옵션을 줘서 바로 바꿔버려도 된다.
df.reset_index(drop=True, inplace=True)
print(df)
[Output]
c0 c1 c2 c3 c4
0 1 4 7 10 13
1 2 5 8 11 14
2 3 6 9 12 15
4. 행 인덱스 기준으로 정렬 : sort_index()
함수
이번에는 인덱스를 기준으로 데이터프레임을 정렬하는 함수이다.
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data, index = ['r0','r1','r2'])
인덱스(r0,r1,r2)를 내림차순으로 정렬(디폴트는 오름차순이다)
ndf = df.sort_index(ascending=False)
print(ndf)
[Output]
c0 c1 c2 c3 c4
r2 3 6 9 12 15
r1 2 5 8 11 14
r0 1 4 7 10 13
5. 특정 열의 데이터 값을 기준으로 정렬 : sort_values()
함수
엑셀에서 많이 했던 정렬 기능이라고 보면된다.
df.sort_value(by ='열이름', ascending = True)
가 기본이다. 특정 열의 값을 기준으로 정렬해준다.
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
df = pd.DataFrame(dict_data, index = ['r0','r1','r2'])
c1열을 기준으로 내림차순 정렬
ndf = df.sort_values(by = 'c1',ascending=False)
print(df, '\n')
print(ndf)
[Output]
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15
c0 c1 c2 c3 c4
r2 3 6 9 12 15
r1 2 5 8 11 14
r0 1 4 7 10 13
Reference
도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.
댓글남기기