본문 바로가기
코딩취미/Python

Pandas 정렬 고급편: 다중 조건 정렬과 GroupBy 후 정렬 완전 정복

by 브링블링 2025. 5. 3.
반응형

Pandas 정렬 고급편: 다중 조건 정렬과 GroupBy 후 정렬 완전 정복

Pandas는 데이터 분석에서 가장 널리 사용되는 도구입니다. 그만큼 "정렬" 또한 강력하고 유연한 기능을 제공합니다.
특히 실무에서는 하나의 조건만이 아니라, 여러 조건으로 정렬하거나 groupby로 묶은 후 정렬해야 하는 경우가 매우 많습니다.

 

이번 글에서는 Pandas의 다중 조건 정렬groupby 후 정렬을 예제 중심으로 완벽하게 설명합니다.


✅ 1. 다중 조건 정렬 (sort_values + by 리스트)

Pandas에서 여러 조건으로 정렬하려면 sort_values()의 by에 리스트 형태로 컬럼을 넣어주면 됩니다.

📌 예제 데이터

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice'],
    'score': [85, 90, 80, 70, 95],
    'age': [25, 30, 22, 30, 23]
})

📌 이름 오름차순 → 점수 내림차순 정렬

sorted_df = df.sort_values(by=['name', 'score'], ascending=[True, False])
print(sorted_df)
 

결과:

    name  score  age
4  Alice     95   23
0  Alice     85   25
2  Alice     80   22
1    Bob     90   30
3    Bob     70   30

ascending=[True, False]로 각각 정렬 방향을 따로 지정 가능!


✅ 2. inplace 정렬과 ignore_index

df.sort_values(by=['name', 'score'], ascending=[True, False], inplace=True, ignore_index=True)
  • inplace=True: 원본을 직접 수정
  • ignore_index=True: 기존 인덱스를 리셋하여 0부터 재지정

실무에서는 ignore_index=True를 자주 사용해요.
인덱스가 엉킬 일 없이 깔끔하게 정렬 결과를 사용할 수 있기 때문이죠.


✅ 3. GroupBy 후 정렬 — 실무에서 자주 등장

📌 그룹별 평균 점수 계산

grouped = df.groupby('name')['score'].mean().reset_index()
print(grouped)
 

결과:

    name  score
0  Alice   86.67
1    Bob   80.00

📌 그룹 결과를 평균 점수 기준으로 내림차순 정렬

sorted_group = grouped.sort_values(by='score', ascending=False)
반응형

✅ 4. GroupBy 결과 내부 정렬

groupby로 묶은 후 그룹 내부에서 특정 기준으로 정렬하고 싶다면?

df_sorted = df.sort_values(by=['name', 'score'], ascending=[True, False])
 

이처럼 먼저 정렬을 해두고 groupby 하면 정렬된 채로 그룹 처리됩니다.


✅ 5. GroupBy + 정렬 후 다시 DataFrame으로 병합

# 각 그룹에서 점수 상위 1개만 추출
top_scores = df.sort_values('score', ascending=False).groupby('name').head(1)
print(top_scores)
 

결과:

    name  score  age
4  Alice     95   23
1    Bob     90   30

이 방식은 그룹별 Top-N 추출에 매우 자주 사용됩니다. (groupby().head(n))


✅ 6. 실무에서 유용한 패턴

🧠 정렬 후 인덱스 초기화

df.sort_values(by='score', ascending=False, ignore_index=True)

🧠 정렬된 상태로 groupby 처리

df.sort_values(by='score').groupby('name').tail(1)  # 각 그룹의 최고 점수

✅ 정리 요약

목적 코드
다중 조건 정렬 sort_values(by=['col1', 'col2'], ascending=[True, False])
그룹별 통계 정렬 groupby().agg().sort_values()
그룹 내부 정렬 sort_values(by=['group', 'value'])
그룹별 top-N 추출 groupby('col').head(N)
인덱스 재정렬 ignore_index=True
 
반응형