{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# pandas 100제 실습 노트북\n",
    "\n",
    "위퀴즈 북스 「pandas 100제: 판다스 연습문제와 풀이」의 실습용 노트북입니다.\n",
    "\n",
    "1. 장마다 **준비 코드** 셀을 먼저 실행하세요 (Shift+Enter).\n",
    "2. 문제 아래 빈 셀에 코드를 써서 실행합니다. 같은 장의 문제는 번호 순서대로 이어집니다.\n",
    "3. 막히면 책의 힌트와 정답을 펼쳐 보세요: https://wequiz.org/books/pandas-100-exercises/\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 001–010 Series와 DataFrame 만들기\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-001-series-dataframe/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 001. 리스트로 Series 만들기\n",
    "\n",
    "리스트 `[10, 20, 30, 40]`으로 Series를 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 002. 인덱스를 지정한 Series\n",
    "\n",
    "값 `[3, 5, 2]`에 인덱스 `사과`, `배`, `귤`을 붙인 Series를 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 003. 딕셔너리로 Series 만들기\n",
    "\n",
    "딕셔너리 `{\"사과\": 1200, \"바나나\": 800, \"딸기\": 3000}`으로 Series를 만들고 이름을 `price`로 정하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 004. 가장 큰 값과 그 인덱스\n",
    "\n",
    "3번의 과일 가격 Series를 변수 `price`에 담고, 가장 비싼 과일의 이름과 가격을 함께 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 005. 딕셔너리로 DataFrame 만들기\n",
    "\n",
    "다음 자료로 DataFrame `df`를 만드세요. 열 이름은 `name`, `class`, `kor`, `eng`, `math` 순서입니다. 이후 문제에서도 같은 표를 사용합니다.\n",
    "\n",
    "| name | class | kor | eng | math |\n",
    "|---|---|---|---|---|\n",
    "| 김민준 | A | 85 | 78 | 92 |\n",
    "| 이서연 | B | 92 | 88 | 75 |\n",
    "| 박지호 | A | 58 | 64 | 49 |\n",
    "| 최수아 | C | 77 | 95 | 88 |\n",
    "| 정민서 | B | 66 | 59 | 71 |\n",
    "| 강도윤 | C | 90 | 70 | 66 |\n",
    "| 윤하은 | A | 73 | 82 | 95 |\n",
    "| 임시우 | B | 81 | 91 | 60 |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 006. 리스트의 리스트로 DataFrame\n",
    "\n",
    "`[[\"서울\", 9.4], [\"부산\", 3.3]]`을 열 이름 `city`, `value`로 DataFrame으로 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 007. numpy 배열로 DataFrame\n",
    "\n",
    "0부터 11까지의 수를 3행 4열로 배치하고 열 이름을 `A`~`D`로 정하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 008. 행과 열의 개수\n",
    "\n",
    "`df`의 행 수와 열 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 009. 열 이름 바꾸기\n",
    "\n",
    "`df`의 `kor`, `eng`, `math`를 `국어`, `영어`, `수학`으로 바꾼 표를 앞 3행만 보이세요. 원본은 바꾸지 마세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 010. 열을 인덱스로\n",
    "\n",
    "`name` 열을 인덱스로 만든 표의 앞 3행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 011–020 데이터 살펴보기\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-011-explore/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 011. 앞부분 보기\n",
    "\n",
    "`df`의 처음 3행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 012. 뒷부분 보기\n",
    "\n",
    "`df`의 마지막 2행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 013. 열 이름 목록\n",
    "\n",
    "`df`의 열 이름을 리스트로 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 014. 열별 자료형\n",
    "\n",
    "`df`의 열별 자료형을 확인하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 015. 요약 통계\n",
    "\n",
    "수학 점수의 개수, 평균, 표준편차, 사분위수를 한 번에 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 016. 범주별 개수\n",
    "\n",
    "반별 학생 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 017. 고유한 값\n",
    "\n",
    "반 이름의 종류와 종류 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 018. 평균과 최댓값\n",
    "\n",
    "국어 점수의 평균과 최댓값을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 019. 여러 열의 평균\n",
    "\n",
    "세 과목 각각의 평균을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 020. 무작위로 뽑기\n",
    "\n",
    "`df`에서 3행을 무작위로 뽑으세요. 결과가 늘 같도록 `random_state=0`을 주세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 021–030 열과 행 선택하기\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-021-select/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 021. 열 하나 꺼내기\n",
    "\n",
    "`name` 열을 Series로 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 022. 여러 열 꺼내기\n",
    "\n",
    "`name`과 `math` 두 열을 DataFrame으로 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 023. loc로 한 행\n",
    "\n",
    "인덱스 라벨이 2인 학생의 정보(행 전체)를 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 024. iloc로 범위\n",
    "\n",
    "처음 3행의 두 번째·세 번째 열(`class`, `kor`)을 **위치 번호**로 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 025. loc로 행과 열\n",
    "\n",
    "인덱스 라벨 0~2 학생의 `name`, `kor`를 **라벨**로 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 026. 값 하나 꺼내기\n",
    "\n",
    "인덱스 3 학생의 영어 점수 하나만 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 027. 열 지우기\n",
    "\n",
    "`class` 열을 뺀 표의 앞 3행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 028. 새 열 만들기\n",
    "\n",
    "세 과목 합계 열 `total`을 추가하고 앞 3행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 029. 계산 열 추가\n",
    "\n",
    "평균 열 `avg`(소수 첫째 자리 반올림)를 추가하고 `name`, `total`, `avg`를 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 030. 열 순서 바꾸기\n",
    "\n",
    "`class`, `name`, `avg` 순서로 열을 골라 앞 3행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 031–040 조건으로 거르기\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-031-filter/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})\n",
    "df['total'] = df['kor'] + df['eng'] + df['math']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 031. 조건 하나\n",
    "\n",
    "수학 80점 이상인 학생을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 032. 그리고 조건\n",
    "\n",
    "A반이면서 영어 70점 이상인 학생을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 033. 또는 조건\n",
    "\n",
    "국어나 수학 중 하나라도 60점 미만인 학생을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 034. 여러 값 중 하나\n",
    "\n",
    "A반 또는 C반 학생의 `name`, `class`를 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 035. 조건 뒤집기\n",
    "\n",
    "B반이 아닌 학생의 이름을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 036. query로 거르기\n",
    "\n",
    "국어 점수가 영어 점수보다 높은 학생을 `query`로 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 037. 범위 안의 값\n",
    "\n",
    "합계가 220점 이상 250점 이하인 학생을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 038. 글자가 들어간 행\n",
    "\n",
    "이름에 '민'이 들어간 학생을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 039. 조건에 맞는 개수\n",
    "\n",
    "수학 80점 이상인 학생은 몇 명인가요?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 040. 조건으로 값 정하기\n",
    "\n",
    "합계 240점 이상이면 `합격`, 아니면 `불합격`인 `result` 열을 만들고 `name`, `total`, `result`를 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 041–050 정렬과 순위\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-041-sort-rank/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})\n",
    "df['total'] = df['kor'] + df['eng'] + df['math']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 041. 내림차순 정렬\n",
    "\n",
    "수학 점수가 높은 순으로 정렬하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 042. 두 기준으로 정렬\n",
    "\n",
    "반 이름 오름차순, 같은 반 안에서는 합계 내림차순으로 정렬하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 043. 상위 n개\n",
    "\n",
    "합계 상위 3명을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 044. 하위 n개\n",
    "\n",
    "영어 점수 하위 2명의 `name`, `eng`를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 045. 인덱스로 되돌리기\n",
    "\n",
    "수학 순으로 정렬한 표를 다시 인덱스 순서로 되돌리세요(앞 3행)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 046. 순위 매기기\n",
    "\n",
    "합계 기준 전체 순위(1등이 가장 높은 점수) 열 `rank`를 만들고 `name`, `total`, `rank`를 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 047. 반별 순위\n",
    "\n",
    "반 안에서의 합계 순위 열 `class_rank`를 만들고 반·순위 순으로 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 048. 인덱스 새로 매기기\n",
    "\n",
    "합계 내림차순으로 정렬한 뒤 인덱스를 0부터 다시 매기세요(앞 3행)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 049. 최고 점수의 주인\n",
    "\n",
    "수학 최고 점수를 받은 학생의 이름을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 050. 열 이름 순 정렬\n",
    "\n",
    "열 이름을 가나다(알파벳) 순으로 정렬해 앞 2행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 051–060 결측치와 중복\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-051-missing/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '최수아'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C'],\n",
    "    'score': [85, np.nan, 58, 77, np.nan, 77],\n",
    "    'memo': ['우수', None, None, '성실', '결석', '성실'],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 051. 열별 결측치 개수\n",
    "\n",
    "열마다 빈 값이 몇 개인지 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 052. 결측치가 있는 행\n",
    "\n",
    "빈 값이 하나라도 있는 행을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 053. 결측치 행 지우기\n",
    "\n",
    "빈 값이 있는 행을 모두 지우세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 054. 특정 열 기준으로 지우기\n",
    "\n",
    "`score`가 빈 행만 지우세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 055. 0으로 채우기\n",
    "\n",
    "`score`의 빈 값을 0으로 채운 Series를 구하세요(원본은 그대로 둡니다)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 056. 평균으로 채우기\n",
    "\n",
    "`score`의 빈 값을 평균으로 채운 Series를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 057. 그룹 평균으로 채우기\n",
    "\n",
    "`score`의 빈 값을 같은 반의 평균으로 채우세요. 같은 반에 값이 없으면 빈 값으로 남습니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 058. 앞의 값으로 채우기\n",
    "\n",
    "`memo`의 빈 값을 바로 위 행의 값으로 채우세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 059. 중복 행 찾기\n",
    "\n",
    "앞에서 이미 나온 행과 완전히 같은 중복 행이 몇 개인지 세고, 그 행을 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 060. 기준 열로 중복 지우기\n",
    "\n",
    "`name`이 같은 행은 마지막 행만 남기세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 061–070 문자열과 날짜\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-061-string-datetime/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "orders = pd.DataFrame({\n",
    "    'customer': ['  Kim ', 'lee', 'PARK', 'Choi  ', 'kim'],\n",
    "    'email': ['kim@naver.com', 'lee@gmail.com', 'park@daum.net', 'choi@gmail.com', 'kim2@naver.com'],\n",
    "    'phone': ['010-1234-5678', '010-2222-3333', '010-9876-5432', '010-5555-0000', '010-1111-2222'],\n",
    "    'order_date': ['2026-01-15', '2026-01-28', '2026-02-03', '2026-02-17', '2026-03-09'],\n",
    "    'amount': [32000, 15000, 47000, 22000, 18000],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 061. 공백 지우고 소문자로\n",
    "\n",
    "`customer`의 앞뒤 공백을 지우고 소문자로 바꾸세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 062. 글자 바꾸기\n",
    "\n",
    "`phone`의 하이픈(-)을 모두 지우세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 063. 문자열 나누기\n",
    "\n",
    "`email`에서 @ 뒤의 도메인만 꺼내세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 064. 글자 수\n",
    "\n",
    "`email`의 글자 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 065. 특정 글자로 시작\n",
    "\n",
    "이메일이 `kim`으로 시작하는 주문을 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 066. 날짜형으로 바꾸기\n",
    "\n",
    "`order_date`를 날짜형으로 바꾸고 자료형을 확인하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 067. 월·요일 꺼내기\n",
    "\n",
    "날짜에서 월(`month`)과 요일(`weekday`) 열을 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 068. 날짜 차이\n",
    "\n",
    "각 주문이 2026-03-31로부터 며칠 전인지 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 069. 기간으로 거르기\n",
    "\n",
    "2026년 2월에 들어온 주문만 고르세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 070. 월별 합계\n",
    "\n",
    "월별 주문 금액 합계를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 071–080 그룹별 집계\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-071-groupby/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "sales = pd.DataFrame({\n",
    "    'date': ['2026-03-01', '2026-03-01', '2026-03-02', '2026-03-02',\n",
    "             '2026-03-03', '2026-03-03', '2026-03-04', '2026-03-04'],\n",
    "    'store': ['강남', '홍대', '강남', '홍대', '강남', '홍대', '강남', '홍대'],\n",
    "    'menu': ['아메리카노', '라떼', '라떼', '아메리카노', '아메리카노', '케이크', '케이크', '라떼'],\n",
    "    'qty': [30, 12, 18, 25, 28, 7, 9, 15],\n",
    "    'price': [4500, 5000, 5000, 4500, 4500, 6500, 6500, 5000],\n",
    "})\n",
    "sales['revenue'] = sales['qty'] * sales['price']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 071. 그룹 합계\n",
    "\n",
    "매장별 매출 합계를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 072. 그룹 평균\n",
    "\n",
    "메뉴별 평균 판매 수량을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 073. 여러 집계 한 번에\n",
    "\n",
    "매장별 수량의 합계·평균·최댓값을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 074. 이름 붙인 집계\n",
    "\n",
    "메뉴별 `총수량`(qty 합)과 `총매출`(revenue 합)을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 075. 두 기준으로 묶어 펼치기\n",
    "\n",
    "매장 × 메뉴별 수량 합계를 구하고, 메뉴를 열로 펼치세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 076. 피벗 테이블\n",
    "\n",
    "날짜를 행, 매장을 열로 하는 매출 합계 표를 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 077. 그룹 크기\n",
    "\n",
    "메뉴별 판매 기록(행) 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 078. 그룹 안 비율\n",
    "\n",
    "각 행의 매출이 해당 매장 전체 매출의 몇 %인지 `share` 열로 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 079. 조건에 맞는 그룹만\n",
    "\n",
    "총매출이 20만 원 이상인 메뉴의 행만 남기세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 080. 그룹별 최댓값 행\n",
    "\n",
    "매장별로 매출이 가장 큰 판매 기록을 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 081–090 합치기와 모양 바꾸기\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-081-merge-reshape/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "students = pd.DataFrame({'name': ['김민준', '이서연', '박지호', '최수아'],\n",
    "                         'class': ['A', 'B', 'A', 'C']})\n",
    "clubs = pd.DataFrame({'name': ['김민준', '박지호', '정민서'],\n",
    "                      'club': ['축구', '밴드', '독서']})\n",
    "scores = pd.DataFrame({'student': ['김민준', '이서연', '박지호', '최수아'],\n",
    "                       'kor': [85, 92, 58, 77], 'eng': [78, 88, 64, 95]})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 081. 공통 열로 합치기\n",
    "\n",
    "`students`와 `clubs`를 `name`으로 합치세요(양쪽에 있는 학생만)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 082. 왼쪽 기준 합치기\n",
    "\n",
    "모든 학생을 남기고 동아리 정보를 붙이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 083. 열 이름이 다를 때\n",
    "\n",
    "`students`의 `name`과 `scores`의 `student`를 기준으로 합치세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 084. 어느 쪽에 있었는지\n",
    "\n",
    "양쪽 모든 행을 남기고, 행이 어디서 왔는지 표시하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 085. 아래로 이어 붙이기\n",
    "\n",
    "`students` 아래에 새 학생 한 명(이름 `정민서`, 반 `B`)을 붙이고, 인덱스를 0부터 다시 매기세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 086. 옆으로 이어 붙이기\n",
    "\n",
    "`students`와 `scores`의 `kor`, `eng`를 옆으로 붙이세요(행 순서가 같다고 가정)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 087. 넓은 표를 길게\n",
    "\n",
    "`scores`를 `student`, `subject`, `score` 세 열의 긴 표로 바꾸세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 088. 긴 표를 넓게\n",
    "\n",
    "87번의 긴 표를 다시 학생별 과목 열로 펼치세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 089. 교차표\n",
    "\n",
    "모든 학생에게 동아리 정보를 붙인 뒤(왼쪽 결합), 반(행) × 동아리 가입 여부(열: `가입`/`미가입`)별 학생 수를 교차표로 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 090. 리스트를 행으로 펼치기\n",
    "\n",
    "다음 표의 `tags` 열에는 리스트가 들어 있습니다. 태그 하나가 한 행이 되도록 펼치세요.\n",
    "\n",
    "```python\n",
    "t = pd.DataFrame({'post': [1, 2], 'tags': [['pandas', 'python'], ['sql']]})\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 091–100 실전 종합\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-091-practice/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})\n",
    "df['total'] = df['kor'] + df['eng'] + df['math']\n",
    "\n",
    "daily = pd.DataFrame({\n",
    "    'date': pd.date_range('2026-03-01', periods=7, freq='D'),\n",
    "    'visitors': [120, 135, 128, 160, 155, 210, 198],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 091. 구간 나누기\n",
    "\n",
    "0~300점의 정수인 합계를 `0~199`, `200~239`, `240~300` 세 구간(`C`, `B`, `A`)으로 나눈 `grade` 열을 만드세요. 0점도 C에 포함하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 092. 값 바꿔 끼우기\n",
    "\n",
    "반 이름을 담임 이름(A: 한선생, B: 오선생, C: 문선생)으로 바꾼 `teacher` 열을 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 093. 가장 잘한 과목\n",
    "\n",
    "학생마다 국어·영어·수학 중 점수가 가장 높은 과목의 열 이름을 구하세요. 결과의 인덱스는 학생 이름으로 하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 094. 같은 인원으로 나누기\n",
    "\n",
    "수학 점수를 사분위로 나눠 `Q1`~`Q4`를 붙이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 095. 누적 합계\n",
    "\n",
    "`daily`의 날짜별 누적 방문자 수를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 096. 이동 평균\n",
    "\n",
    "`daily`의 3일 이동 평균 방문자 수를 소수 첫째 자리까지 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 097. 전날 대비 증감률\n",
    "\n",
    "전날 대비 방문자 증감률(%)을 소수 첫째 자리까지 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 098. 전날 값 옆에 놓기\n",
    "\n",
    "전날 방문자 수 열 `prev`와 차이 `diff`를 만드세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 099. 과목 간 상관관계\n",
    "\n",
    "세 과목 점수의 상관계수 표를 구하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 100. 종합: 반별 리포트\n",
    "\n",
    "반별 학생 수, 평균 합계(소수 첫째 자리), 최고 득점자 이름을 한 표로 만들고 평균 합계가 높은 반부터 보이세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 보너스 V01–V10 pandas 시각화: 선·막대·히스토그램·산점도\n",
    "\n",
    "해설·힌트·정답: https://wequiz.org/books/pandas-100-exercises/pandas-100-bonus-visualization/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**준비 코드** — 첫 줄은 그래프 한글 글꼴 패키지 설치입니다. 이 셀을 먼저 실행하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -q koreanize-matplotlib setuptools   # 처음 한 번 설치 (터미널에서는 ! 없이)\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import koreanize_matplotlib            # 그래프 한글 깨짐 방지\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'name': ['김민준', '이서연', '박지호', '최수아', '정민서', '강도윤', '윤하은', '임시우'],\n",
    "    'class': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B'],\n",
    "    'kor': [85, 92, 58, 77, 66, 90, 73, 81],\n",
    "    'eng': [78, 88, 64, 95, 59, 70, 82, 91],\n",
    "    'math': [92, 75, 49, 88, 71, 66, 95, 60],\n",
    "})\n",
    "df['total'] = df['kor'] + df['eng'] + df['math']\n",
    "\n",
    "sales = pd.DataFrame({\n",
    "    'date': ['2026-03-01', '2026-03-01', '2026-03-02', '2026-03-02',\n",
    "             '2026-03-03', '2026-03-03', '2026-03-04', '2026-03-04'],\n",
    "    'store': ['강남', '홍대', '강남', '홍대', '강남', '홍대', '강남', '홍대'],\n",
    "    'menu': ['아메리카노', '라떼', '라떼', '아메리카노', '아메리카노', '케이크', '케이크', '라떼'],\n",
    "    'qty': [30, 12, 18, 25, 28, 7, 9, 15],\n",
    "    'price': [4500, 5000, 5000, 4500, 4500, 6500, 6500, 5000],\n",
    "})\n",
    "sales['revenue'] = sales['qty'] * sales['price']\n",
    "\n",
    "daily = pd.DataFrame({\n",
    "    'date': pd.date_range('2026-03-01', periods=7, freq='D'),\n",
    "    'visitors': [120, 135, 128, 160, 155, 210, 198],\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V01. 선 그래프\n",
    "\n",
    "`daily`의 날짜별 방문자 수를 점이 찍힌 선 그래프로 그리세요. 제목은 `일별 방문자 수`로 합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V02. 막대그래프\n",
    "\n",
    "매장별 매출 합계를 막대그래프로 그리세요. 가로축 글자는 눕히지 말고 똑바로 세우세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V03. 정렬한 가로 막대\n",
    "\n",
    "메뉴별 총매출을 가로 막대그래프로 그리되, 매출이 가장 큰 메뉴가 맨 위에 오게 하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V04. 히스토그램\n",
    "\n",
    "수학 점수의 분포를 히스토그램으로 그리세요. 40점부터 100점까지 10점 간격(6개 구간)으로 나눕니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V05. 상자그림\n",
    "\n",
    "국어·영어·수학 점수 분포를 과목별 상자그림 하나에 나란히 그리세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V06. 산점도\n",
    "\n",
    "국어 점수(가로)와 수학 점수(세로)의 관계를 산점도로 그리고, 제목에 두 과목의 상관계수를 소수 둘째 자리까지 넣으세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V07. 묶은 막대\n",
    "\n",
    "메뉴(가로축)별로 매장의 판매 수량을 나란히 비교하는 묶은 막대그래프를 그리세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V08. 누적 막대\n",
    "\n",
    "날짜별 매출을 매장별로 쌓은 누적 막대그래프를 그리세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V09. 실제 값과 이동 평균\n",
    "\n",
    "방문자 수와 3일 이동 평균(096번)을 한 그래프에 함께 그리세요. 이동 평균은 점선으로 구분합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### V10. 여러 그래프를 한 장에 저장\n",
    "\n",
    "왼쪽에는 매장별 매출 막대(V02), 오른쪽에는 방문자 선 그래프(V01)를 나란히 놓은 그림을 만들고 `report.png` 파일로 저장하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 여기에 코드를 쓰고 Shift+Enter\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
