달나라 노트

Python Pandas : sort_values (DataFrame의 정렬, DataFrame 정렬하기) 본문

Python/Python Pandas

Python Pandas : sort_values (DataFrame의 정렬, DataFrame 정렬하기)

CosmosProject 2021. 1. 6. 15:49
728x90
반응형

 

 

 

Pandas에선 DataFrame에 존재하는 Data를 정렬하기 위한 sort_values라는 함수를 제공합니다.

 

import pandas as pd

dict_test = {
    'col1': [3, 1, 2, 3, 2, 1],
    'col2': ['b', 'a', 'd', 'e', 'y', 'z']
}

df_test = pd.DataFrame(dict_test)
print(df_test)
print(type(df_test))

- Output
   col1 col2
0     3    b
1     1    a
2     2    d
3     3    e
4     2    y
5     1    z
<class 'pandas.core.frame.DataFrame'>

먼저 테스트용 DataFrame을 만듭시다.

 

 

 

 

 

df_test_sorted = df_test.sort_values(by=['col1'], ascending=True)
print(df_test_sorted)

- Output
   col1 col2
1     1    a
5     1    z
2     2    d
4     2    y
0     3    b
3     3    e

sort_values라는 함수를 DataFrame에 적용할 수 있습니다.

by라는 인자에 정렬의 기준이 될 column name을 전달합니다.

또한 ascending = True로 설정하게 되면 오름차순을 하라는 뜻입니다.(default 값은 ascending=True입니다.)

 

 

 

 

df_test_sorted = df_test.sort_values(by=['col1'], ascending=False)
print(df_test_sorted)

- Output
   col1 col2
0     3    b
3     3    e
2     2    d
4     2    y
1     1    a
5     1    z

ascending=False로 설정하면 col1 기준 내림차순으로 설정되는걸 알 수 있습니다.

 

 

 

 

df_test_sorted = df_test.sort_values(by=['col1', 'col2'], ascending=True)
print(df_test_sorted)

- Output
   col1 col2
1     1    a
5     1    z
2     2    d
4     2    y
0     3    b
3     3    e

df_test_sorted = df_test.sort_values(by=['col1', 'col2'], ascending=False)
print(df_test_sorted)

   col1 col2
3     3    e
0     3    b
4     2    y
2     2    d
5     1    z
1     1    a

위 예시처럼 by 인자에 2개 이상의 column이름을 넣을 수 있습니다.

이 경우는 가장 첫 번째 명시된(가장 왼쪽의) column이 가장 나중에 정렬되며(가장 왼쪽 컬럼이 final 정렬 컬럼이 됩니다.) 가장 오른쪽에 명시된 column이 제일 먼저 정렬된다고 할 수 있습니다.

마치 엑셀에서 가장 오른쪽에 명시된 컬럼부터 정렬을 하기 시작해서 가장 왼쪽의 컬럼을 가장 나중에 정렬하는 결과와 동일합니다.

 

위 말을 좀 다르게 하면 가장 왼쪽에 적힌 컬럼일수록 더 높은 우선순위로 정렬되기 때문에 가장 나중에 정렬하는 효과를 가집니다.

 

 

 

 

 

 

df_test.sort_values(by=['col1', 'col2'], ascending=True, inplace=True, ignore_index=True)
print(df_test)


- Output
   col1 col2
0     1    a
1     1    z
2     2    d
3     2    y
4     3    b
5     3    e

sort_values 함수에는 inplace라는 옵션과 ignore_index라는 옵션이 있습니다.

inplace=True 로 설정하면 sort_values가 적용되는 DataFrame 자체에 정렬을 적용합니다.

ignore_index=True로 설정하면 정렬을 한 후 index를 0부터 다시 매깁니다.

지금까지의 예시를 보면 정렬 후의 index가 0부터 차례대로 있지 않고 정렬 전의 index를 그대로 가져가는걸 볼 수 있습니다.

하지만 위 예시는 index가 0부터 1씩 증가하는 모습을 볼 수 있습니다.

 

 

 

 

 

 

 

 

만약 2개 이상의 컬럼을 기준으로 정렬을 할 것이고,

각 컬럼별로 오름차순으로 정렬할지 내림차순으로 정렬할지를 다 다르게 설정하고 싶으면 어떻게 해야할까요?

 

그에 대한 답이 아래 예시에 있습니다.

 

import pandas as pd

dict_test = {
    'col1': [1, 1,
             2, 2, 2,
             3, 3, 3, 3, 3,
             4, 4, 4,
             5, 5, 5, 5],
    'col2': [1000, 2000,
             100, 300, 500,
             200, 300, 100, 150, 180,
             580, 200, 10,
             100, 80, 55, 10]
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_test = df_test.sort_values(by=['col1', 'col2'],
                              ascending=[True, False],
                              ignore_index=True,
                              inplace=False)
print(df_test)


-- Result
    col1  col2
0      1  2000
1      1  1000
2      2   500
3      2   300
4      2   100
5      3   300
6      3   200
7      3   180
8      3   150
9      3   100
10     4   580
11     4   200
12     4    10
13     5   100
14     5    80
15     5    55
16     5    10

 

결과를 보면 col1 기준으로는 오름차순이 되어있으며, col2 기준으로는 내림차순이 되어있습니다.

그래서 동일한 col1 값을 가진 행들에 대해서는 col2값이 내림차순으로 되어있죠.

 

 

 

 

df_test = df_test.sort_values(by=['col1', 'col2'],
                              ascending=[True, False],
                              ignore_index=True,
                              inplace=False)

sort_values() method를 사용한 부분을 보면 위와 같습니다.

by 인자에 정렬의 기준이 될 column 이름을 적어주었고,

ascending 인자에는 각 column별로 오름차순(True)을 할지 내림차순(False)을 할지를 list의 형태로 명시해줍니다.

 

이렇게 column별 오름차순/내림차순을 원하는대로 결정할 수 있습니다.

 

 

 

 

 

 

728x90
반응형
Comments