{
"cells": [
{
"cell_type": "markdown",
"id": "d8fc6544",
"metadata": {},
"source": [
"# pandas: Create Pivot Table"
]
},
{
"cell_type": "markdown",
"id": "97bd0c14",
"metadata": {},
"source": [
"## Package Import"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d7cc5d66",
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-02T18:59:02.205714Z",
"iopub.status.busy": "2025-09-02T18:59:02.205587Z",
"iopub.status.idle": "2025-09-02T18:59:02.432372Z",
"shell.execute_reply": "2025-09-02T18:59:02.431737Z"
},
"tags": [
"hide-output",
"scroll-output"
]
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"id": "4e87e13e",
"metadata": {},
"source": [
"## Dataset Import"
]
},
{
"cell_type": "markdown",
"id": "37018a84",
"metadata": {},
"source": [
"The dataset used in this notebook is from [Kaggle - Pokemon](https://www.kaggle.com/datasets/abcsds/pokemon)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "82aa9ab2",
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-02T18:59:02.434127Z",
"iopub.status.busy": "2025-09-02T18:59:02.433974Z",
"iopub.status.idle": "2025-09-02T18:59:02.438708Z",
"shell.execute_reply": "2025-09-02T18:59:02.438238Z"
},
"tags": [
"hide-output",
"scroll-output"
]
},
"outputs": [],
"source": [
"data = pd.read_csv('data/Pokemon.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d192adfc",
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-02T18:59:02.440104Z",
"iopub.status.busy": "2025-09-02T18:59:02.439983Z",
"iopub.status.idle": "2025-09-02T18:59:02.449030Z",
"shell.execute_reply": "2025-09-02T18:59:02.448596Z"
},
"tags": [
"hide-output",
"scroll-output"
]
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" # | \n",
" Name | \n",
" Type 1 | \n",
" Type 2 | \n",
" Total | \n",
" HP | \n",
" Attack | \n",
" Defense | \n",
" Sp. Atk | \n",
" Sp. Def | \n",
" Speed | \n",
" Generation | \n",
" Legendary | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Bulbasaur | \n",
" Grass | \n",
" Poison | \n",
" 318 | \n",
" 45 | \n",
" 49 | \n",
" 49 | \n",
" 65 | \n",
" 65 | \n",
" 45 | \n",
" 1 | \n",
" False | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" Ivysaur | \n",
" Grass | \n",
" Poison | \n",
" 405 | \n",
" 60 | \n",
" 62 | \n",
" 63 | \n",
" 80 | \n",
" 80 | \n",
" 60 | \n",
" 1 | \n",
" False | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" Venusaur | \n",
" Grass | \n",
" Poison | \n",
" 525 | \n",
" 80 | \n",
" 82 | \n",
" 83 | \n",
" 100 | \n",
" 100 | \n",
" 80 | \n",
" 1 | \n",
" False | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" VenusaurMega Venusaur | \n",
" Grass | \n",
" Poison | \n",
" 625 | \n",
" 80 | \n",
" 100 | \n",
" 123 | \n",
" 122 | \n",
" 120 | \n",
" 80 | \n",
" 1 | \n",
" False | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" Charmander | \n",
" Fire | \n",
" NaN | \n",
" 309 | \n",
" 39 | \n",
" 52 | \n",
" 43 | \n",
" 60 | \n",
" 50 | \n",
" 65 | \n",
" 1 | \n",
" False | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 795 | \n",
" 719 | \n",
" Diancie | \n",
" Rock | \n",
" Fairy | \n",
" 600 | \n",
" 50 | \n",
" 100 | \n",
" 150 | \n",
" 100 | \n",
" 150 | \n",
" 50 | \n",
" 6 | \n",
" True | \n",
"
\n",
" \n",
" 796 | \n",
" 719 | \n",
" DiancieMega Diancie | \n",
" Rock | \n",
" Fairy | \n",
" 700 | \n",
" 50 | \n",
" 160 | \n",
" 110 | \n",
" 160 | \n",
" 110 | \n",
" 110 | \n",
" 6 | \n",
" True | \n",
"
\n",
" \n",
" 797 | \n",
" 720 | \n",
" HoopaHoopa Confined | \n",
" Psychic | \n",
" Ghost | \n",
" 600 | \n",
" 80 | \n",
" 110 | \n",
" 60 | \n",
" 150 | \n",
" 130 | \n",
" 70 | \n",
" 6 | \n",
" True | \n",
"
\n",
" \n",
" 798 | \n",
" 720 | \n",
" HoopaHoopa Unbound | \n",
" Psychic | \n",
" Dark | \n",
" 680 | \n",
" 80 | \n",
" 160 | \n",
" 60 | \n",
" 170 | \n",
" 130 | \n",
" 80 | \n",
" 6 | \n",
" True | \n",
"
\n",
" \n",
" 799 | \n",
" 721 | \n",
" Volcanion | \n",
" Fire | \n",
" Water | \n",
" 600 | \n",
" 80 | \n",
" 110 | \n",
" 120 | \n",
" 130 | \n",
" 90 | \n",
" 70 | \n",
" 6 | \n",
" True | \n",
"
\n",
" \n",
"
\n",
"
800 rows × 13 columns
\n",
"
"
],
"text/plain": [
" # Name Type 1 Type 2 Total HP Attack Defense \\\n",
"0 1 Bulbasaur Grass Poison 318 45 49 49 \n",
"1 2 Ivysaur Grass Poison 405 60 62 63 \n",
"2 3 Venusaur Grass Poison 525 80 82 83 \n",
"3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 \n",
"4 4 Charmander Fire NaN 309 39 52 43 \n",
".. ... ... ... ... ... .. ... ... \n",
"795 719 Diancie Rock Fairy 600 50 100 150 \n",
"796 719 DiancieMega Diancie Rock Fairy 700 50 160 110 \n",
"797 720 HoopaHoopa Confined Psychic Ghost 600 80 110 60 \n",
"798 720 HoopaHoopa Unbound Psychic Dark 680 80 160 60 \n",
"799 721 Volcanion Fire Water 600 80 110 120 \n",
"\n",
" Sp. Atk Sp. Def Speed Generation Legendary \n",
"0 65 65 45 1 False \n",
"1 80 80 60 1 False \n",
"2 100 100 80 1 False \n",
"3 122 120 80 1 False \n",
"4 60 50 65 1 False \n",
".. ... ... ... ... ... \n",
"795 100 150 50 6 True \n",
"796 160 110 110 6 True \n",
"797 150 130 70 6 True \n",
"798 170 130 80 6 True \n",
"799 130 90 70 6 True \n",
"\n",
"[800 rows x 13 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "markdown",
"id": "a50511c0",
"metadata": {},
"source": [
"## Create a pivot table"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "31fa86f3",
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-02T18:59:02.450601Z",
"iopub.status.busy": "2025-09-02T18:59:02.450470Z",
"iopub.status.idle": "2025-09-02T18:59:02.464326Z",
"shell.execute_reply": "2025-09-02T18:59:02.463865Z"
},
"tags": [
"hide-output",
"scroll-output"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" Legendary | \n",
" False | \n",
" True | \n",
"
\n",
" \n",
" Type 1 | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Bug | \n",
" 70.971014 | \n",
" NaN | \n",
"
\n",
" \n",
" Dark | \n",
" 86.862069 | \n",
" 110.500000 | \n",
"
\n",
" \n",
" Dragon | \n",
" 103.400000 | \n",
" 126.666667 | \n",
"
\n",
" \n",
" Electric | \n",
" 66.125000 | \n",
" 98.750000 | \n",
"
\n",
" \n",
" Fairy | \n",
" 57.187500 | \n",
" 131.000000 | \n",
"
\n",
" \n",
" Fighting | \n",
" 96.777778 | \n",
" NaN | \n",
"
\n",
" \n",
" Fire | \n",
" 82.191489 | \n",
" 109.000000 | \n",
"
\n",
" \n",
" Flying | \n",
" 50.000000 | \n",
" 107.500000 | \n",
"
\n",
" \n",
" Ghost | \n",
" 71.366667 | \n",
" 110.000000 | \n",
"
\n",
" \n",
" Grass | \n",
" 72.119403 | \n",
" 97.666667 | \n",
"
\n",
" \n",
" Ground | \n",
" 88.000000 | \n",
" 150.000000 | \n",
"
\n",
" \n",
" Ice | \n",
" 73.227273 | \n",
" 67.500000 | \n",
"
\n",
" \n",
" Normal | \n",
" 72.083333 | \n",
" 140.000000 | \n",
"
\n",
" \n",
" Poison | \n",
" 74.678571 | \n",
" NaN | \n",
"
\n",
" \n",
" Psychic | \n",
" 54.953488 | \n",
" 122.142857 | \n",
"
\n",
" \n",
" Rock | \n",
" 89.925000 | \n",
" 122.250000 | \n",
"
\n",
" \n",
" Steel | \n",
" 92.086957 | \n",
" 96.250000 | \n",
"
\n",
" \n",
" Water | \n",
" 72.777778 | \n",
" 111.250000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Legendary False True \n",
"Type 1 \n",
"Bug 70.971014 NaN\n",
"Dark 86.862069 110.500000\n",
"Dragon 103.400000 126.666667\n",
"Electric 66.125000 98.750000\n",
"Fairy 57.187500 131.000000\n",
"Fighting 96.777778 NaN\n",
"Fire 82.191489 109.000000\n",
"Flying 50.000000 107.500000\n",
"Ghost 71.366667 110.000000\n",
"Grass 72.119403 97.666667\n",
"Ground 88.000000 150.000000\n",
"Ice 73.227273 67.500000\n",
"Normal 72.083333 140.000000\n",
"Poison 74.678571 NaN\n",
"Psychic 54.953488 122.142857\n",
"Rock 89.925000 122.250000\n",
"Steel 92.086957 96.250000\n",
"Water 72.777778 111.250000"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.pivot_table(index='Type 1', columns='Legendary', values='Attack', aggfunc='mean')"
]
},
{
"cell_type": "markdown",
"id": "67008e47",
"metadata": {},
"source": [
"The advantage of pivot table compared to using groupby + unstack is the `margins` parameter, which adds a row/column that gives the totals (or other aggregate functions) for each row/column:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "cd24ed55",
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-02T18:59:02.466104Z",
"iopub.status.busy": "2025-09-02T18:59:02.465979Z",
"iopub.status.idle": "2025-09-02T18:59:02.479536Z",
"shell.execute_reply": "2025-09-02T18:59:02.479105Z"
},
"tags": [
"hide-output",
"scroll-output"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" Legendary | \n",
" False | \n",
" True | \n",
" All | \n",
"
\n",
" \n",
" Type 1 | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Bug | \n",
" 70.971014 | \n",
" NaN | \n",
" 70.971014 | \n",
"
\n",
" \n",
" Dark | \n",
" 86.862069 | \n",
" 110.500000 | \n",
" 88.387097 | \n",
"
\n",
" \n",
" Dragon | \n",
" 103.400000 | \n",
" 126.666667 | \n",
" 112.125000 | \n",
"
\n",
" \n",
" Electric | \n",
" 66.125000 | \n",
" 98.750000 | \n",
" 69.090909 | \n",
"
\n",
" \n",
" Fairy | \n",
" 57.187500 | \n",
" 131.000000 | \n",
" 61.529412 | \n",
"
\n",
" \n",
" Fighting | \n",
" 96.777778 | \n",
" NaN | \n",
" 96.777778 | \n",
"
\n",
" \n",
" Fire | \n",
" 82.191489 | \n",
" 109.000000 | \n",
" 84.769231 | \n",
"
\n",
" \n",
" Flying | \n",
" 50.000000 | \n",
" 107.500000 | \n",
" 78.750000 | \n",
"
\n",
" \n",
" Ghost | \n",
" 71.366667 | \n",
" 110.000000 | \n",
" 73.781250 | \n",
"
\n",
" \n",
" Grass | \n",
" 72.119403 | \n",
" 97.666667 | \n",
" 73.214286 | \n",
"
\n",
" \n",
" Ground | \n",
" 88.000000 | \n",
" 150.000000 | \n",
" 95.750000 | \n",
"
\n",
" \n",
" Ice | \n",
" 73.227273 | \n",
" 67.500000 | \n",
" 72.750000 | \n",
"
\n",
" \n",
" Normal | \n",
" 72.083333 | \n",
" 140.000000 | \n",
" 73.469388 | \n",
"
\n",
" \n",
" Poison | \n",
" 74.678571 | \n",
" NaN | \n",
" 74.678571 | \n",
"
\n",
" \n",
" Psychic | \n",
" 54.953488 | \n",
" 122.142857 | \n",
" 71.456140 | \n",
"
\n",
" \n",
" Rock | \n",
" 89.925000 | \n",
" 122.250000 | \n",
" 92.863636 | \n",
"
\n",
" \n",
" Steel | \n",
" 92.086957 | \n",
" 96.250000 | \n",
" 92.703704 | \n",
"
\n",
" \n",
" Water | \n",
" 72.777778 | \n",
" 111.250000 | \n",
" 74.151786 | \n",
"
\n",
" \n",
" All | \n",
" 75.669388 | \n",
" 116.676923 | \n",
" 79.001250 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Legendary False True All\n",
"Type 1 \n",
"Bug 70.971014 NaN 70.971014\n",
"Dark 86.862069 110.500000 88.387097\n",
"Dragon 103.400000 126.666667 112.125000\n",
"Electric 66.125000 98.750000 69.090909\n",
"Fairy 57.187500 131.000000 61.529412\n",
"Fighting 96.777778 NaN 96.777778\n",
"Fire 82.191489 109.000000 84.769231\n",
"Flying 50.000000 107.500000 78.750000\n",
"Ghost 71.366667 110.000000 73.781250\n",
"Grass 72.119403 97.666667 73.214286\n",
"Ground 88.000000 150.000000 95.750000\n",
"Ice 73.227273 67.500000 72.750000\n",
"Normal 72.083333 140.000000 73.469388\n",
"Poison 74.678571 NaN 74.678571\n",
"Psychic 54.953488 122.142857 71.456140\n",
"Rock 89.925000 122.250000 92.863636\n",
"Steel 92.086957 96.250000 92.703704\n",
"Water 72.777778 111.250000 74.151786\n",
"All 75.669388 116.676923 79.001250"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.pivot_table(index='Type 1', columns='Legendary', values='Attack', aggfunc='mean', margins=True)"
]
}
],
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}