[Pandas 기초] 인덱스 활용 및 정렬

업데이트:

개요

jpg


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

도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.

댓글남기기