pandas 100제: 판다스 연습문제와 풀이 · 5장

041–050 정렬과 순위

sort_values, 여러 기준 정렬, nlargest, nsmallest, sort_index, rank, idxmax 연습문제

4분 읽기

정렬하고 순위를 매기는 문제입니다.

준비 코드

이 장의 문제는 아래 코드를 먼저 실행한 상태에서 풉니다.

Pythonimport pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],
    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],
    'kor': [85, 92, 58, 77, 66, 90, 73, 81],
    'eng': [78, 88, 64, 95, 59, 70, 82, 91],
    'math': [92, 75, 49, 88, 71, 66, 95, 60],
})
df['total'] = df['kor'] + df['eng'] + df['math']

041. 내림차순 정렬

수학 점수가 높은 순으로 정렬하세요.

정답 보기
Pythondf.sort_values('math', ascending=False)
결과     name class  kor  eng  math  total
6  윤하은     A   73   82    95    250
0  김민준     A   85   78    92    255
3  최수아     C   77   95    88    260
1  이서연     B   92   88    75    255
4  정민서     B   66   59    71    196
5  강도윤     C   90   70    66    226
7  임시우     B   81   91    60    232
2  박지호     A   58   64    49    171

042. 두 기준으로 정렬

반 이름 오름차순, 같은 반 안에서는 합계 내림차순으로 정렬하세요.

정답 보기
Pythondf.sort_values(['class', 'total'], ascending=[True, False])
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
6  윤하은     A   73   82    95    250
2  박지호     A   58   64    49    171
1  이서연     B   92   88    75    255
7  임시우     B   81   91    60    232
4  정민서     B   66   59    71    196
3  최수아     C   77   95    88    260
5  강도윤     C   90   70    66    226

043. 상위 n개

합계 상위 3명을 구하세요.

정답 보기
Pythondf.nlargest(3, 'total')
결과     name class  kor  eng  math  total
3  최수아     C   77   95    88    260
0  김민준     A   85   78    92    255
1  이서연     B   92   88    75    255

정렬 후 head(3)과 같지만 더 짧고 빠릅니다.

044. 하위 n개

영어 점수 하위 2명의 name, eng를 구하세요.

정답 보기
Pythondf.nsmallest(2, 'eng')[['name', 'eng']]
결과     name  eng
4  정민서   59
2  박지호   64

045. 인덱스로 되돌리기

수학 순으로 정렬한 표를 다시 인덱스 순서로 되돌리세요(앞 3행).

정답 보기
Pythondf.sort_values('math').sort_index().head(3)
결과     name class  kor  eng  math  total
0  김민준     A   85   78    92    255
1  이서연     B   92   88    75    255
2  박지호     A   58   64    49    171

046. 순위 매기기

합계 기준 전체 순위(1등이 가장 높은 점수) 열 rank를 만들고 name, total, rank를 보이세요.

정답 보기
Pythondf['rank'] = df['total'].rank(ascending=False, method='min').astype(int)
df[['name', 'total', 'rank']]
결과     name  total  rank
0  김민준    255     2
1  이서연    255     2
2  박지호    171     8
3  최수아    260     1
4  정민서    196     7
5  강도윤    226     6
6  윤하은    250     4
7  임시우    232     5

method='min'은 동점자에게 같은 순위를 줍니다.

047. 반별 순위

반 안에서의 합계 순위 열 class_rank를 만들고 반·순위 순으로 보이세요.

정답 보기
Pythondf['class_rank'] = df.groupby('class')['total'].rank(ascending=False).astype(int)
df.sort_values(['class', 'class_rank'])[['class', 'name', 'total', 'class_rank']]
결과  class    name  total  class_rank
0     A  김민준    255           1
6     A  윤하은    250           2
2     A  박지호    171           3
1     B  이서연    255           1
7     B  임시우    232           2
4     B  정민서    196           3
3     C  최수아    260           1
5     C  강도윤    226           2

048. 인덱스 새로 매기기

합계 내림차순으로 정렬한 뒤 인덱스를 0부터 다시 매기세요(앞 3행).

정답 보기
Pythondf.sort_values('total', ascending=False).reset_index(drop=True).head(3)
결과     name class  kor  eng  math  total  rank  class_rank
0  최수아     C   77   95    88    260     1           1
1  김민준     A   85   78    92    255     2           1
2  이서연     B   92   88    75    255     2           1

drop=True가 없으면 기존 인덱스가 열로 남습니다.

049. 최고 점수의 주인

수학 최고 점수를 받은 학생의 이름을 구하세요.

정답 보기
Pythondf.loc[df['math'].idxmax(), 'name']
결과'윤하은'

050. 열 이름 순 정렬

열 이름을 가나다(알파벳) 순으로 정렬해 앞 2행을 보이세요.

정답 보기
Pythondf.sort_index(axis=1).head(2)
결과  class  class_rank  eng  kor  math    name  rank  total
0     A           1   78   85    92  김민준     2    255
1     B           1   88   92    75  이서연     2    255

axis=1은 열 방향입니다.

전체 메뉴