AI/Pandas

03. 인덱스 활용( set_index(), reindex(), reset_index(), sort_index() )

Python version : 3.7.10

Pandas version : 1.1.5

특정 열을 행 인덱스로 설정(set_index())

set_index() 메소드를 사용하여 데이터 프레임의 특정 열을 행 인덱스로 설정할 수 있습니다.
원본 객체를 바꾸지 않고 새로운 객체를 반환하는 점에 유의합시다.
만약 원래 객체를 변경하고 싶다면 옵션을 통해 설정이 가능합니다.

exam_data = {
    '이름' : ['서준', '예린', '지은'],
    '수학' : [90, 80, 70],
    '영어' : [95, 89, 90],
    '음악' : [95, 80, 100],
    '체육' : [100, 90, 90]
}
exam_df = pd.DataFrame(exam_data)

위와 같은 데이터에서 특정 열을 행 인덱스로 설정해봅시다.

exam_indexed_name_df = exam_df.set_index('이름')

print("특정 열을 인덱스로 설정")
print(exam_indexed_name_df)
print('\n')

'이름' 열을 행 인덱스로 설정하기 위해서 set_index('이름') 괄호 안에 '이름'을 넣은 것을 알 수 있습니다.
만약 원본 객체를 변경하고 싶다면 inplace=True 옵션을 지정해주면 됩니다.

2개의 열을 행 인덱스로 지정할 수도 있습니다.

print("여러 열을 인덱스로 설정")
exam_indexed_name_df2 = exam_df.set_index(['음악', '수학']) #index가 두 개 멀티인덱스(MultiIndex)라고 한다.
print(exam_indexed_name_df2)
print('\n')

set_index(['음악', '수학'])와 같이 괄호 안에 리스트로 원하는 열을 지정해주면 됩니다.

행 인덱스 재배열(reindex())

reindex() 메소드를 사용하면 데이터프레임의 행 인덱스를 새로운 리스트로 재지정할 수 있습니다.
마찬가지로 새로운 객체를 반환합니다.
기존 데이터프레임에 존재하지 않는 행 인덱스가 추가되는 경우 데이터 값은 NaN이 됩니다.

dict_data = {
    'c0' : [ 1,  2,  3],
    'c1' : [ 4,  5,  6],
    'c2' : [ 7,  8,  9],
    'c3' : [10, 11, 12],
    'c4' : [13, 14, 15]
}
dict_df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])
print("reindex 사용")
new_index = ['r0', 'r1', 'r2', 'r3', 'r4']
new_dict_df = dict_df.reindex(new_index)
print(new_dict_df)

행 인덱스로 지정할 new_index 리스트를 만든 후 reindex()메소드를 통해 행 인덱스를 재지정 했습니다.
이때 'r3r4행의 데이터는 없기 때문에 NaN이 됩니다.
NaN값을 없애기 위해서는 fill_value옵션을 사용하여 값을 채워줄 수 있습니다.

print("NaN 방지를 위해 fill_value = 0 옵션 사용")
new_dict_df2 = dict_df.reindex(new_index, fill_value=0)
print(new_dict_df2)

fill_value=0으로 설정하는 것으로 NaN대신 0으로 값이 채워지게 됩니다.

행 인덱스 초기화(reset_index())

reset_index() 메소드를 활용하여 행 인덱스를 정수형 위치 인덱스로 초기화할 수 있습니다. 이때 기존 행 인덱스는 열로 이동합니다.

dict_data = {
    'c0' : [ 1,  2,  3],
    'c1' : [ 4,  5,  6],
    'c2' : [ 7,  8,  9],
    'c3' : [10, 11, 12],
    'c4' : [13, 14, 15]
}
dict_df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])

#원래 index는 열로 이동
reseted_df = dict_df.reset_index()
print(reseted_df)

위 코드에서는 dict_data를 이용하여 dict_df를 만들 때 다른 배열을 행 인덱스로 지정해줍니다.
그 후 reset_index()메소드를 활용해 행 인덱스를 정수형 위치 인덱스로 리셋할 수 있는 것을 보여줍니다.

행 인덱스를 기준으로 데이터프레임 정렬(sort_index())

sort_index() 메소드를 활용하여 행 인덱스를 기준으로 데이터프레임의 값을 정렬할 수 있습니다.
ascending 옵션을 사용하여 오름차순과 내림차순을 지정할 수 있습니다.
ascending=False일 때 내림차순, ascending=True일 때 오름차순으로 설정 가능합니다.

dict_data = {
    'c0' : [ 1,  2,  3],
    'c1' : [ 4,  5,  6],
    'c2' : [ 7,  8,  9],
    'c3' : [10, 11, 12],
    'c4' : [13, 14, 15]
}
dict_df = pd.DataFrame(dict_data, index=['r1', 'r0', 'r2'])

다음 코드는 각각 행 인덱스를 기준으로 오름차순과 내림차순으로 정렬하는 방법입니다.

print("오름차순으로 정렬")
sorted_df = dict_df.sort_index(ascending=True)
print(sorted_df)
print('\n')

print("내림차순으로 정렬")
sorted_df2 = dict_df.sort_index(ascending=False)
print(sorted_df2)
print('\n')

특정 열의 데이터 값을 기준으로 데이터프레임 정렬(sort_value())

위에서는 행 인덱스를 기준으로 데이터프레임을 정렬했다면 이번엔 열의 데이터를 기준으로 정렬하는 방법입니다.
sort_value() 메소드를 사용하여 정렬할 수 있습니다.
인덱스가 기준일 땐 sort_index() 값이 기준일 땐 sort_value()로 기억하면 될 것 같습니다.

dict_data = {
    'c0' : [ 1,  2,  3],
    'c1' : [ 4,  5,  6],
    'c2' : [ 7,  8,  9],
    'c3' : [10, 11, 12],
    'c4' : [13, 14, 15]
}
dict_df = pd.DataFrame(dict_data, index=['r1', 'r0', 'r2'])

c1 열의 데이터 값을 기준으로 오름차순으로 정렬하는 방법입니다.

print("c1을 기준으로 오름차순 정렬")
sorted_df = dict_df.sort_values(by = 'c1', ascending=True)
print(sorted_df)
print('\n')

Reference

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

'AI > Pandas' 카테고리의 다른 글

04. 산술 연산(연산 메소드)  (0) 2021.04.25
02. 자료구조 - 데이터프레임(Data Frame)  (0) 2021.04.19
01. 자료구조 - 시리즈  (0) 2021.04.17
00. 판다스 시작하기  (0) 2021.04.17