Python DataFrame 순위 지정 rank() 함수

판다스 DataFrame에 저장한 데이터 값을 판단해 순위를 지정하기 위해 rank() 함수를 사용합니다.

DataFrame에 저장한 값을 정렬하기 위해서는 sort_values()를 사용합니다.

rank()는 정렬은 하지 않고 순위를 지정할 수 있습니다.

샘플 데이터를 만들어 rank() 사용 방법을 알아보겠습니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df)

 

결과

   col1  col2 col3
a    50   0.3    h
b    80   NaN    j
c   100   0.1    i
d    80   NaN    k

 

rank 사용 방법

rank() 함수를 실행하면 각 열마다 순위 값을 반환합니다.

아무것도 지정하지 않으면 기본값인 오름 차순으로 순위를 정합니다.

만약 같은 값이 있는 경우에는 평균 순위로 값을 반환합니다.

문자열은 알파벳순으로 비교합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank())

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   2.5   NaN   3.0
c   4.0   1.0   2.0
d   2.5   NaN   4.0

 

행 또는 열 변경 axis

기본값으로 순위를 비교하는 기준은 열을 기준으로 합니다.

행 단위로 순위를 구하고 싶은 경우에는 axis를 1로 설정합니다.

axis를 1로 설정해 행 단위로 순위를 구하는 경우에는 문자열은 무시하고 처리됩니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(axis=1))

 

결과

   col1  col2
a   2.0   1.0
b   1.0   NaN
c   2.0   1.0
d   1.0   NaN

 

숫자만 순위 지정

열을 기준으로 순위를 취득할 때 기본 설정으로는 숫자와 문자열 모두 순위 값을 반환합니다.

숫자만 대상으로 순위를 취득하고 싶은 경우에는 numeric_only를 True로 지정합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(numeric_only=True))

 

결과

   col1  col2
a   1.0   2.0
b   2.5   NaN
c   4.0   1.0
d   2.5   NaN

 

내림 차순

순위를 구하는 순서는 작은 값부터 큰 값을 기준으로 하는 오름 차순이 기본 설정입니다.

큰 값부터 작은 값 순서인 내림 차순으로 순위를 구하고 싶은 경우에는 ascending을 False로 설정합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(ascending=False))

 

결과

   col1  col2  col3
a   4.0   1.0   4.0
b   2.5   NaN   2.0
c   1.0   2.0   3.0
d   2.5   NaN   1.0

 

중복값 설정

같은 값이 있는 경우에는 평균으로 순위를 반환합니다.

중복 값을 표시하는 기본 설정이 method=’average’로 되어있기 때문입니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(method='average'))

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   2.5   NaN   3.0
c   4.0   1.0   2.0
d   2.5   NaN   4.0

 

method에 min 또는 max를 지정해 표시 방법을 변경할 수 있습니다.

method에 min을 설정해 실행해 보겠습니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(method='min'))

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   2.0   NaN   3.0
c   4.0   1.0   2.0
d   2.0   NaN   4.0

 

1위, 2위, 2위, 4위 같은 형식으로 표시되었습니다.

method에 max을 설정해 실행해 보겠습니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(method='max'))

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   3.0   NaN   3.0
c   4.0   1.0   2.0
d   3.0   NaN   4.0

 

method에 first를 설정해 실행이 가능합니다.

first를 설정하면 DataFrame에 같은 값이 존재하는 경우 저장되어 있는 순서대로 순위를 지정합니다.

주의할 점으로는 first를 지정한 경우에는 숫자 타입만 가능하기 때문에 numeric_only=True도 같이 설정해야 합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(method='first', numeric_only=True))

 

결과

   col1  col2
a   1.0   2.0
b   2.0   NaN
c   4.0   1.0
d   3.0   NaN

 

min을 설정한 경우에는 중복 값이 있는 만큼 순위를 건너뛰고 표시합니다.

method에 dense를 설정하면 순위를 건너 뛰지 않고 표시합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(method='dense'))

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   2.0   NaN   3.0
c   3.0   1.0   2.0
d   2.0   NaN   4.0

 

NaN 설정

DataFrame에 NaN이 있는 경우에는 아무런 처리도 하지 않고 NaN으로 표시됩니다.

na_option에 값을 지정해 NaN을 제어할 수 있습니다.

기본값으로는 na_option=’keep’이며 NaN을 처리하지 않고 NaN으로 표시합니다.

생략한 경우와 같습니다.

NaN 값을 1위로 순위를 지정하고 싶은 경우에는 top을 지정합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(na_option='top'))
#    col1  col2  col3
# a   1.0   4.0   1.0
# b   2.5   1.5   3.0
# c   4.0   3.0   2.0
# d   2.5   1.5   4.0

print(df.rank(na_option='top', method='min'))
#    col1  col2  col3
# a   1.0   4.0   1.0
# b   2.0   1.0   3.0
# c   4.0   3.0   2.0
# d   2.0   1.0   4.0

 

결과

   col1  col2  col3
a   1.0   4.0   1.0
b   2.5   1.5   3.0
c   4.0   3.0   2.0
d   2.5   1.5   4.0

   col1  col2  col3
a   1.0   4.0   1.0
b   2.0   1.0   3.0
c   4.0   3.0   2.0
d   2.0   1.0   4.0

 

NaN을 최하위로 지정하고 싶은 경우에는 bottom을 지정합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df.rank(na_option='bottom'))
#    col1  col2  col3
# a   1.0   2.0   1.0
# b   2.5   3.5   3.0
# c   4.0   1.0   2.0
# d   2.5   3.5   4.0

print(df.rank(na_option='bottom', method='min'))
#    col1  col2  col3
# a   1.0   2.0   1.0
# b   2.0   3.0   3.0
# c   4.0   1.0   2.0
# d   2.0   3.0   4.0

 

결과

   col1  col2  col3
a   1.0   2.0   1.0
b   2.5   3.5   3.0
c   4.0   1.0   2.0
d   2.5   3.5   4.0

   col1  col2  col3
a   1.0   2.0   1.0
b   2.0   3.0   3.0
c   4.0   1.0   2.0
d   2.0   3.0   4.0

 

컬럼 지정

특정 컬럼만 지정해 순위를 구하고 싶은 경우에는 해당 컬럼명을 설정합니다.

import pandas as pd

df = pd.DataFrame({'col1': [50, 80, 100, 80],
                   'col2': [0.3, pd.np.nan, 0.1, pd.np.nan],
                   'col3': ['h', 'j', 'i', 'k']},
                  index=['a', 'b', 'c', 'd'])

print(df['col1'].rank(method='min', ascending=False))

 

결과

a    4.0
b    2.0
c    1.0
d    2.0
Name: col1, dtype: float64

 

pandas.Series에서도 DataFrame과 동일하게 사용을 할 수 있습니다.

댓글