본문 바로가기
프로그래밍/Python 관련 정보

[Pandas] Rank

by TrillionNT 2025. 2. 23.

2025.02.24 - [프로그래밍/Python 관련 정보] - [Pandas] Table of Contents


Pandas의 rank 매서드 입니다. SQL에서는 row_number()나 rank()를 쓸일이 많은데 pandas에서도 이런 기능을 탑재하고 있네요. 순위를 구하는 매서드입니다. 

 

(1) Syntax

DataFrame.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)

 

(2) 입력인자

  • axis=0 (Default; 열 기준)
    위를 계산할 축 (0: 각 열, 1: 각 행)
  • method= 'average' (Default)
    동점 처리 방식은 아래와 같은 옵션 중에 선택합니다. 
    method 동점 처리 방식 (10, 10, 20 예시)
    'average' 같은 값이면 평균 rank 부여 1.5, 1.5, 3
    'min' 같은 값이면 가장 작은 rank 부여 1, 1, 3
    'max' 같은 값이면 가장 큰 rank 부여 2, 2, 3
    'first' 데이터 순서대로 rank 부여 1, 2, 3
    'dense' 같은 값은 같은 순위, 다음 순위는 1만 증가 1, 1, 2
  • numeric_only = None (Default; 모든 데이터 처리)
    숫자형 데이터만 처리할지 여부
  • na_option= 'keep' (Default)
    NaN 처리 방법 ('keep', 'top', 'bottom')
  • ascending=True
    순위 계산 시 오름차순 여부 (True: 오름차순, False: 내림차순)
  • pct=False
    순위를 비율로 계산할지 여부 (True: 순위를 0~1 비율로 계산)

 

 

(3) 예시

# 순위를 비율로 계산 (0~1 사이의 값으로)
rank_pct = df.rank(pct=True)
print(rank_pct)
     A    B
0  0.75  0.25
1  0.50  1.00
2  1.00  0.50
3  0.25  0.00

 


Rank함수는 groupby의 함수로도 사용할 수 있습니다. 

import pandas as pd

# 예시 DataFrame
df = pd.DataFrame({
    'emp_id': [1, 1, 2, 2],
    'event_day': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-01'],
    'total_time': [5, 3, 7, 2]
})

# groupby + rank
df['rank'] = df.groupby('emp_id')['total_time'].rank(method='dense', ascending=False)

print(df)

Raw data가 이와 같다면

 

결과물의 형태는 이와 같습니다

 


Leetcode문제에서 rank를 활용하는 실전 예제를 하나 살펴봅시다. 

https://leetcode.com/problems/game-play-analysis-i/description/?envType=study-plan-v2&envId=30-days-of-pandas&lang=pythondata

def game_analysis(activity: pd.DataFrame) -> pd.DataFrame:
    activity['login'] = activity.groupby(['player_id'], as_index=False)[['event_date']].rank()
    return activity[activity.login==1][['player_id', 'event_date']].rename({'event_date':'first_login'}, axis=1)

'프로그래밍 > Python 관련 정보' 카테고리의 다른 글

[Pandas] fillna  (0) 2025.02.23
[Pandas] value_counts  (0) 2025.02.23
[Pandas] select_dtypes()  (0) 2025.02.23
[Pandas] drop_duplicates  (0) 2025.02.23
[Pandas] update  (0) 2025.02.23