pandas 100제: 판다스 연습문제와 풀이 · 5장
041–050 정렬과 순위
sort_values, 여러 기준 정렬, nlargest, nsmallest, sort_index, rank, idxmax 연습문제
정렬하고 순위를 매기는 문제입니다.
준비 코드
이 장의 문제는 아래 코드를 먼저 실행한 상태에서 풉니다.
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 171042. 두 기준으로 정렬
반 이름 오름차순, 같은 반 안에서는 합계 내림차순으로 정렬하세요.
정답 보기
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 226043. 상위 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 박지호 64045. 인덱스로 되돌리기
수학 순으로 정렬한 표를 다시 인덱스 순서로 되돌리세요(앞 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 171046. 순위 매기기
합계 기준 전체 순위(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 2048. 인덱스 새로 매기기
합계 내림차순으로 정렬한 뒤 인덱스를 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은 열 방향입니다.