Python/Pandas

[Pandas] 데이터프레임 정렬하기 : sort_values, sort_index 함수

jimmy_AI 2021. 12. 23. 15:53
반응형

파이썬 판다스 정렬 함수 : sort_values()

안녕하세요. 이번 글에서는 판다스에서 데이터프레임을 정렬하는 함수인

sort_values 함수의 사용법에 대해서 간단히 다루어보겠습니다.

 

우선, 아래와 같은 데이터프레임이 있다고 가정해보겠습니다.

import pandas as pd
import numpy as np

a = {'A' : [1, 3, 2, 2, 3, 4], 'B' : ['a', 'b', 'e', 'a', 'd', 'c'], 
'C' : [np.nan, 1.5, -0.3, np.nan, 4.2, 0.0]}
df = pd.DataFrame(a)
df

A열은 int형, B열은 str형, C열은 float형 자료형임을 가정하겠습니다.

 

sort_values 기본 예시 : 열 1개 기준 정렬

가장 기본적으로 열 1개를 기준으로 정렬을 해보겠습니다. A열을 기준으로 정렬하려면

다음과 같이 작성하면 간단히 오름차순 정렬이 이루어집니다.

정렬을 기준으로 삼을 열의 이름을 by 인자에 지정해주시면 됩니다.

df.sort_values(by = 'A')

A열이 1, 2, 2, 3, 3, 4 순서로 정렬되었습니다.

 

반대로 내림차순 정렬을 하려면 ascending 인자를 False로 지정해주시면 됩니다.

df.sort_values(by = 'A', ascending = False)

 

 

sort_values 열 2개 이상 정렬

이번에는 A열의 값이 같은 경우에는 B열의 값을 기준으로 정렬하고 싶은 상황을

가정해보도록 하겠습니다.

 

이런 경우에는 by 인자에 정렬할 열의 순서를 리스트에 담아주면 됩니다.

이번에도 위와 마찬가지로 내림차순 정렬을 기준으로 예시를 보겠습니다.

# A열이 같으면 -> B열 비교
df.sort_values(by = ['A', 'B'], ascending = False)

A열이 같은 경우, B열의 값을 내림차순 기준으로 정렬된 것을 확인할 수 있었습니다.

(ex. A열이 둘 다 3이면 B열 d -> b)

참고로, 문자열 자료형의 경우 아스키코드 값을 기준으로 정렬이 진행되는데,

기본적으로 알파벳 순이라고 생각해주시면 이해하기 편합니다.

반응형

sort_values 결측치(NaN 값) 순서 정렬

NaN 값은 기본적으로 오름차순/내림차순 정렬 모두에서 맨 뒤에 위치하게 됩니다.

결측치가 있는 C열을 대상으로 오름차순/내림차순 정렬을 진행한 결과를 보겠습니다.

위의 두 결과 모두 NaN 값은 맨 뒤에 위치하였습니다.

 

만일 NaN 값을 맨 앞으로 위치시키고 싶다면, na_position 인자를 'first'로 지정해주면 됩니다.

df.sort_values(by = 'C', na_position = 'first')

 

 

sort_values 함수 기타 인자들

sort_values 함수에서 제공하는 기능은 더 다양하나, 여기서는 모두 다루지는 않고,

몇 가지 다른 인자에 대해 간단히 설명하는 것으로 마무리하겠습니다.

 

axis : 1로 설정하면 행 기준으로 정렬을 할 수 있습니다.(기본 열 기준)

inplace : True로 설정하면 데이터프레임의 값이 자동으로 바뀌어서 반영됩니다.

kind : 정렬 알고리즘 종류를 고를 수 있습니다. 기본으로는 quicksort 입니다.

ignore_index : 정렬 시 index 순서도 뒤섞이는데, True로 설정 시에는 0, 1, 2, ... , n-1로 index를 다시 맞춥니다.

key : 해당 열에 원하는 함수를 적용한 결과를 바탕으로 정렬을 진행할 수 있습니다.

 

 

인덱스 기준 정렬 함수 : sort_index()

마지막으로, 인덱스를 기준으로 정렬 가능한 sort_index 함수를 설명하겠습니다.

함수의 사용법은 sort_values 함수와 거의 동일합니다.

다만, 정렬 기준 열(by 인자)을 지정할 필요가 없습니다.

df.sort_index(ascending = False)