판다스 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과 동일하게 사용을 할 수 있습니다.
댓글