본문 바로가기
공부 목록/IT & 프로그래밍

파이썬 데이터 프레임의 정렬을 위한 sort_values 메서드 사용법

by 독학박사 2023. 4. 29.

목차


     데이터 분석을 위해 파이썬의 판다스 데이터 프레임은 상당히 좋은 라이브러리입니다. 데이터 분석 도중 통계 메서드를 이용해서 데이터의 특성을 살펴보기도 하는데, 데이터를 크고 작은 순으로 정렬할 수 있다면 데이터 특성을 가시화하는데 더 큰 도움이 될 겁니다. 오늘은 데이터 프레임의 메서드들 중 데이터 정렬을 도와주는 sort_values()의 사용에 대해 알아보겠습니다.

     

     

    파이썬 데이터프레임의 데이터 정렬 메서드는?
    파이썬 데이터프레임의 데이터 정렬 메서드는?

     

     

    1. sort_values() 특징

    sort_values()는 데이터 프레임을 특정 열의 기준으로 정렬하는 메서드입니다. 이 메서드의 기본 사용 모습은 아래 코드와 같습니다. 인자들에 값이 입력되어 있는 것은 기본값으로 세팅된 것이며 특정 인자값을 넣지 않으면 해당 값으로 메서드를 수행합니다.

     

    DataFrame.sort_values(
    	by, *, axis=0, ascending=True, inplace=False, kind='quicksort',
       	na_position='last', ignore_index=False, key=None
        )

     

     by 인자에는 정렬할 열의 이름이나 열들의 리스트를 넘겨줄 수 있습니다. 하나의 열을 넣으면 해당 열을 정렬하면서 다른 데이터는 그에 맞게 같이 정렬됩니다. 리스트를 넣는 경우는 하나의 열을 정렬한 상태에서 그 정렬을 유지하면서 다른 열을 정렬하고 싶을 때 사용합니다.

     

     ascending은 정렬 순서를 결정하는 옵션으로, True인 경우 오름차순(점점 커지는 값으로), False인 경우 내림차순(점점 작아지는 값으로)으로 정렬됩니다. axis는 정렬이 되는 축을 지정하는 것으로 0이면 row, 1이면 column을 기준으로 하게 됩니다.

     

     inplace=True로 설정하면 원본 데이터 프레임을 수정하며, inplace=False(기본값)인 경우 원본 데이터 프레임을 수정하지 않고 정렬된 데이터를 반환합니다. na_position은 결측값이 있는 경우 정렬할 때 결측값이 어느 쪽에 위치할지를 지정합니다. 'first'면 맨 앞쪽으로 'last'면 맨 뒤쪽으로 위치시킵니다.

     

     ignore_index의 기본은 False이며 기본값을 사용하게 되면 정렬된 후 데이터 프레임의 인덱스는 정렬된 값을 기준으로 뒤섞여 있을 겁니다. 정렬된 후의 데이터 프레임을 그대로 사용하고 싶다면 인덱스를 순차적으로 바꿔줄 필요가 있습니다. 이럴 경우 True를 인자값으로 하여 index를 재정렬 해줍니다.

     

     

    2. 예제 코드로 확인하는 sort_values()의 인자 사용법

    예제 코드를 설명하기 위해 임의의 데이터 프레임을 정의합니다. 코드는 아래와 같습니다.

     

    import pandas as pd
    
    df = pd.DataFrame({
        'name': ['Eva', 'Charlie', 'Bob', 'David', 'Alice'],
        'age': [25, 30, 20, 28, 22],
        'score': [80, 90, 70, 85, 75]
    })

     

    예제 코드를 위해 생성한 데이터 프레임 구조
    예제 코드를 위해 생성한 데이터 프레임 구조

     

     해당 데이터 프레임을 name 열 기준으로 정렬을 하는데 오름차순을 이용해 보도록 하겠습니다. by에는 정렬할 칼럼명 'name'을 넣고 acending을 True로 설정하여 코드를 작성합니다.

     

    df_sorted = df.sort_values(by='name', ascending=True)
    print(df_sorted)
    
    # 결과값
    #       name  age  score
    # 4    Alice   22     75
    # 2      Bob   20     70
    # 1  Charlie   30     90
    # 3    David   28     85
    # 0      Eva   25     80

     

     이번에는 score가 높은 사람에 대해 이름 순으로 정렬해 보려고 합니다. 두 개의 칼럼으로 정렬을 해야 하기 때문에 by에 리스트 형태의 값을 넣어 줍니다.

     

    df_sorted = df.sort_values(['name', 'score'], ascending=False)
    print(df_sorted)
    
    # 결과값
    # 0      Eva   25     80
    # 3    David   28     85
    # 1  Charlie   30     90
    # 2      Bob   20     70
    # 4    Alice   22     75

     

     두 개 이상의 칼럼을 이용하여 정렬을 하고자 할 때는 가장 중요하게(처음 정렬) 생각되는 칼럼을 우선적으로 넣어주어야 합니다. 위의 코드에서 score가 높은 사람이 우선해야 하기 때문에 예제 코드를 다음과 같이 바꿔서 사용해야 합니다.

     

    df_sorted = df.sort_values(['score', 'name'], ascending=False, ignore_index=True)
    print(df_sorted)
    
    # 결과값
    # name  age  score
    # 0  Charlie   30     90
    # 1    David   28     85
    # 2      Eva   25     80
    # 3    Alice   22     75
    # 4      Bob   20     70

     

     이제야 score가 높은 순으로 배치가 됐습니다. 위의 코드에서는 인덱스를 새롭게 하기 위해 ignore_index를 'True'로 설정해 보았습니다. 이렇게 하는 이유는 추후 그래프를 그리거나 데이터 조작을 하게 될 경우 index의 넘버를 사용해야 하는데 이렇게 순차적이지 않으면 예상하지 못한 결과를 도출하기 때문입니다.

     

     Charlie의 나이를 모르는 것(Nan)으로 변경하여 na_position의 인자를 사용해 보도록 하겠습니다.

     

    df.loc[1, 'age'] = None
    
    df_sorted = df.sort_values(by='age', ascending=True, na_position='first')
    print(df_sorted)
    
    # 결과값
    #       name   age  score
    # 1  Charlie   NaN     90
    # 2      Bob  20.0     70
    # 4    Alice  22.0     75
    # 0      Eva  25.0     80
    # 3    David  28.0     85

     

     결과값이 위와 같이 나오지 않는다면 처음에 생성한 데이터프레임(df)이 예제 코드를 실행하는 동안 변경되어서 그럴 겁니다. 그럴 경우에는 df를 다시 생성해 준 다음에 바로 위의 코드를 실행하면 결과값이 같게 나올 겁니다.

     

     

    3. 마치며

     오늘은 데이터프레임의 메서드들 중에서 데이터를 정렬해 주는 sort_values()에 대한 내용을 정리해 보았습니다. 기본 사용 포맷과 내부 인자들까지 같이 설명을 드렸는데, 몇 가지 빠진 인자들의 경우 잘 사용하지 않는, 일반적이지 않는 것들이라 생략했습니다. 'kind'의 경우 어떤 알고리즘을 이용해서 정렬할지 결정하는 것으로 내부 알로리즘까지 우리가 지정하지 않기에 생략했고, inplace 설정은 원본 데이터프레임을 건드리는 것으로 기본값으로 사용하시는 것을 권장합니다. key 인자는 정렬 기준 열(column)의 값을 어떻게 변환할 것인지 지정하는 함수(function)를 전달할 때 사용되는데, 일반적으로 잘 사용하지 않습니다.

     

     

     

    댓글