{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Creating a Pivot Table\n", "\n", "Pivot Tables are one of the most used features in Excel. You can point to a large table of data and interactively group the data and calculate multiple statistics on each of the groups and sub groups. Pandas makes it easy to do similar functionalities using the _pivot_table_ function. There are multiple options to achieve similar and even more powerful calculations with other Pandas functions, which we will cover later, however, _pivot_table_ is the most straight comparison to the one in Excel, and therefore, we will start with it\n", "\n", "[![Open In Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/aiola-lab/from-excel-to-pandas/blob/master/notebooks/03.01_pivot_tables.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading Data\n", "\n", "As always, we will start with loading some data set (using the great tutorial from [pbpython](https://pbpython.com/pandas-pivot-table-explained.html))" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AccountNameRepManagerProductQuantityPriceStatus
0714466Trantow-BarrowsCraig BookerDebra HenleyCPU130000presented
1714466Trantow-BarrowsCraig BookerDebra HenleySoftware110000presented
2714466Trantow-BarrowsCraig BookerDebra HenleyMaintenance25000pending
3737550Fritsch, Russel and AndersonCraig BookerDebra HenleyCPU135000declined
4146832Kiehn-SpinkaDaniel HiltonDebra HenleyCPU265000won
\n", "
" ], "text/plain": [ " Account Name Rep Manager \\\n", "0 714466 Trantow-Barrows Craig Booker Debra Henley \n", "1 714466 Trantow-Barrows Craig Booker Debra Henley \n", "2 714466 Trantow-Barrows Craig Booker Debra Henley \n", "3 737550 Fritsch, Russel and Anderson Craig Booker Debra Henley \n", "4 146832 Kiehn-Spinka Daniel Hilton Debra Henley \n", "\n", " Product Quantity Price Status \n", "0 CPU 1 30000 presented \n", "1 Software 1 10000 presented \n", "2 Maintenance 2 5000 pending \n", "3 CPU 1 35000 declined \n", "4 CPU 2 65000 won " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "# import numpy as np\n", "\n", "sales_funnel = (\n", " pd\n", " .read_excel(\"https://pbpython.com/extras/sales-funnel.xlsx\")\n", ")\n", "\n", "sales_funnel.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple Pivot Table\n", "\n", "The simplest usage is to define what will be the index of the pivot table, which is equivalent to _Rows_ in Excel pivot table. All the numeric values will be added automatically and their **average** will be calculated." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AccountPriceQuantity
Name
Barton LLC740150350001.000000
Fritsch, Russel and Anderson737550350001.000000
Herman LLC141962650002.000000
Jerde-Hilpert41229050002.000000
Kassulke, Ondricka and Metz30759970003.000000
Keeling LLC6889811000005.000000
Kiehn-Spinka146832650002.000000
Koepp Ltd729833350002.000000
Kulas Inc218895250001.500000
Purdy-Kunde163416300001.000000
Stokes LLC23934475001.000000
Trantow-Barrows714466150001.333333
\n", "
" ], "text/plain": [ " Account Price Quantity\n", "Name \n", "Barton LLC 740150 35000 1.000000\n", "Fritsch, Russel and Anderson 737550 35000 1.000000\n", "Herman LLC 141962 65000 2.000000\n", "Jerde-Hilpert 412290 5000 2.000000\n", "Kassulke, Ondricka and Metz 307599 7000 3.000000\n", "Keeling LLC 688981 100000 5.000000\n", "Kiehn-Spinka 146832 65000 2.000000\n", "Koepp Ltd 729833 35000 2.000000\n", "Kulas Inc 218895 25000 1.500000\n", "Purdy-Kunde 163416 30000 1.000000\n", "Stokes LLC 239344 7500 1.000000\n", "Trantow-Barrows 714466 15000 1.333333" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(index=[\"Name\"])\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multi-Index\n", "\n", "We can define multiple columns as index and create a multi-index." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AccountPriceQuantity
ManagerRep
Debra HenleyCraig Booker720237.020000.0000001.250000
Daniel Hilton194874.038333.3333331.666667
John Smith576220.020000.0000001.500000
Fred AndersonCedric Moss196016.527500.0000001.250000
Wendy Yule614061.544250.0000003.000000
\n", "
" ], "text/plain": [ " Account Price Quantity\n", "Manager Rep \n", "Debra Henley Craig Booker 720237.0 20000.000000 1.250000\n", " Daniel Hilton 194874.0 38333.333333 1.666667\n", " John Smith 576220.0 20000.000000 1.500000\n", "Fred Anderson Cedric Moss 196016.5 27500.000000 1.250000\n", " Wendy Yule 614061.5 44250.000000 3.000000" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(index=[\"Manager\",\"Rep\"])\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Choosing Values\n", "\n", "The _Account_ number is also a numeric column, however, it is not relevant for us to look at in the pivot table, and the same goes for the _Quantity_ column. Therefore, we can choose to take only the _Price_ column for our pivot table." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Price
ManagerRep
Debra HenleyCraig Booker20000.000000
Daniel Hilton38333.333333
John Smith20000.000000
Fred AndersonCedric Moss27500.000000
Wendy Yule44250.000000
\n", "
" ], "text/plain": [ " Price\n", "Manager Rep \n", "Debra Henley Craig Booker 20000.000000\n", " Daniel Hilton 38333.333333\n", " John Smith 20000.000000\n", "Fred Anderson Cedric Moss 27500.000000\n", " Wendy Yule 44250.000000" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"]\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chossing aggregation function\n", "\n", "We want to see the sum of the sales of each sales rep and not the average size of the sales. Let's request to use the _sum_ as the aggregation function. Other functions are _mean_ (default), _median_ _count_, _min_, _max_, _var_, _std_, and _prod_" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Price
ManagerRep
Debra HenleyCraig Booker80000
Daniel Hilton115000
John Smith40000
Fred AndersonCedric Moss110000
Wendy Yule177000
\n", "
" ], "text/plain": [ " Price\n", "Manager Rep \n", "Debra Henley Craig Booker 80000\n", " Daniel Hilton 115000\n", " John Smith 40000\n", "Fred Anderson Cedric Moss 110000\n", " Wendy Yule 177000" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " aggfunc='sum'\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Choosing Columns\n", "\n", "The _Columns_ selection in Excel is similar to the one in pivot table in Pandas. We can add a breakdown of the sales per product, by adding it as the _Columns_ of the pivot table" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'np' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Price\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"Product\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0maggfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m )\n\u001b[1;32m 9\u001b[0m )\n", "\u001b[0;31mNameError\u001b[0m: name 'np' is not defined" ] } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " columns=[\"Product\"],\n", " aggfunc='sum'\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Removing Null (NaN) values\n", "\n", "To make the table cleaner we can replace all the NaN values with 0" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Price
ProductCPUMaintenanceMonitorSoftware
ManagerRep
Debra HenleyCraig Booker650005000010000
Daniel Hilton1050000010000
John Smith35000500000
Fred AndersonCedric Moss950005000010000
Wendy Yule165000700050000
\n", "
" ], "text/plain": [ " Price \n", "Product CPU Maintenance Monitor Software\n", "Manager Rep \n", "Debra Henley Craig Booker 65000 5000 0 10000\n", " Daniel Hilton 105000 0 0 10000\n", " John Smith 35000 5000 0 0\n", "Fred Anderson Cedric Moss 95000 5000 0 10000\n", " Wendy Yule 165000 7000 5000 0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " columns=[\"Product\"],\n", " aggfunc='sum',\n", " fill_value=0\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add more values such as _Quantity_" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PriceQuantity
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerRep
Debra HenleyCraig Booker6500050000100002201
Daniel Hilton10500000100004001
John Smith350005000001200
Fred AndersonCedric Moss9500050000100003101
Wendy Yule1650007000500007320
\n", "
" ], "text/plain": [ " Price Quantity \\\n", "Product CPU Maintenance Monitor Software CPU \n", "Manager Rep \n", "Debra Henley Craig Booker 65000 5000 0 10000 2 \n", " Daniel Hilton 105000 0 0 10000 4 \n", " John Smith 35000 5000 0 0 1 \n", "Fred Anderson Cedric Moss 95000 5000 0 10000 3 \n", " Wendy Yule 165000 7000 5000 0 7 \n", "\n", " \n", "Product Maintenance Monitor Software \n", "Manager Rep \n", "Debra Henley Craig Booker 2 0 1 \n", " Daniel Hilton 0 0 1 \n", " John Smith 2 0 0 \n", "Fred Anderson Cedric Moss 1 0 1 \n", " Wendy Yule 3 2 0 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\",\"Quantity\"],\n", " columns=[\"Product\"],\n", " aggfunc='sum',\n", " fill_value=0\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Showing Totals\n", "\n", "The default pivot table in Pandas is not showing the totals of the columns or rows, however, we can add it with _margins=True_. It will add _All_ both for the columns at the bottom and for the rows on the right." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Price
ProductCPUMaintenanceMonitorSoftwareAll
ManagerRep
Debra HenleyCraig Booker65000500001000080000
Daniel Hilton1050000010000115000
John Smith3500050000040000
Fred AndersonCedric Moss950005000010000110000
Wendy Yule165000700050000177000
All46500022000500030000522000
\n", "
" ], "text/plain": [ " Price \n", "Product CPU Maintenance Monitor Software All\n", "Manager Rep \n", "Debra Henley Craig Booker 65000 5000 0 10000 80000\n", " Daniel Hilton 105000 0 0 10000 115000\n", " John Smith 35000 5000 0 0 40000\n", "Fred Anderson Cedric Moss 95000 5000 0 10000 110000\n", " Wendy Yule 165000 7000 5000 0 177000\n", "All 465000 22000 5000 30000 522000" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " columns=[\"Product\"],\n", " aggfunc='sum',\n", " fill_value=0,\n", " margins=True\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualize the pivot table\n", "\n", "we can see the values in a graph" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAFrCAYAAADhI++lAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABfCElEQVR4nO2dd5gUVdaH3x+giBkFXRUVzJKVIOpiAEkmMKcVFBVzFkXdz5x1ZcW4uCIGFF1MrDnhihlQRMyoqLioKIqyihLO98e5PTTDEASme6b6vM/Tz3TfulV9uqaqzr3nniAzIwiCIAgKRY1iCxAEQRCUFqF4giAIgoISiicIgiAoKKF4giAIgoISiicIgiAoKLWKLcCypl69etawYcNiixEEQVCtGDNmzHdmVr8Q35U5xdOwYUNGjx5dbDGCIAiqFZI+L9R3haktCIIgKCiheIIgCIKCEoonCIIgKCiZW+OpiJkzZzJp0iRmzJhRbFGCKswKK6xAgwYNWG655YotShBkmpJQPJMmTWKVVVahYcOGSCq2OEEVxMz4/vvvmTRpEo0aNSq2OEGQaUrC1DZjxgzWXHPNUDrBApHEmmuuGbPiICgAJaF4gFA6wSKJayQICkPJKJ4gCIKgahCKp0hI4vTTTy/7fM0113DBBRdU6nc2bNiQZs2a0bx5czp37szXX3+9xMc67LDDGDZs2BLte9llly3x9wZBUP0pCeeCqkjt2rV58MEHOfvss6lXr17BvnfEiBHUq1ePc845h8suu4wBAwaUbTMzzIwaNSp3PHLZZZdxzjnnVOp3BEGhaNjvsYVun3jFbgWSpPoQM54iUatWLfr06UP//v3n2zZx4kQ6dOhA8+bN6dixI1988QXgs4yTTjqJ7bbbjo022mieGcfVV19NmzZtaN68Oeeff/4iv3+HHXZgwoQJTJw4kc0335yePXvStGlTvvzyS/r27UvTpk1p1qwZ9913H+BK6YQTTmDzzTdnl1124dtvvy07VsOGDfnuu+8AGD16NDvttBMA06dP5/DDDy+bZT3wwAP069ePX3/9lZYtW3LIIYcs8fkLgqD6EoqniBx//PEMGTKEadOmzdN+4okn0qtXL8aNG8chhxzCSSedVLZt8uTJvPTSSzz66KP069cPgKeffpqPP/6YN954g7FjxzJmzBhefPHFhX73o48+SrNmzQD4+OOPOe6443j33XcZPXo0Y8eO5e233+bZZ5+lb9++TJ48mYceeogPP/yQ9957jzvvvJNXXnllkb/v4osvZrXVVuOdd95h3LhxdOjQgSuuuII6deowduxYhgwZ8kdPWRAEGWCRikfSIEnfShpfrv1ESR9IelfSVXntZ0uaIOlDSV3y2rumtgmS+uW1N5L0emq/T9Lyqb12+jwhbW+4TH5xFWLVVVelZ8+e85i7AF599VUOPvhgAA499FBeeumlsm09evSgRo0aNG7cmG+++QZwxfP000+z1VZbsfXWW/PBBx/w8ccfV/idO++8My1btuSnn37i7LPPBmDDDTekXbt2ALz00kscdNBB1KxZk7XXXpsdd9yRUaNG8eKLL5a1r7vuunTo0GGRv+/ZZ5/l+OOPL/tct27dP3B2giDIKouzxjMYuAG4M9cgaWegO9DCzH6TtFZqbwwcCDQB1gWelbRZ2u1GoBMwCRglabiZvQdcCfQ3s6GSbgGOAG5Of38ws00kHZj6HbC0P7iqccopp7D11ltz+OGHL1b/2rVrl703s7K/Z599NkcfffQi98+t8eT48ccfWWmllf6g1PNSq1Yt5syZAxBxMEEQLJJFznjM7EVgarnmY4ErzOy31Cdn8O8ODDWz38zsM2AC0Da9JpjZp2b2OzAU6C4PnOgA5BYr7gB65B3rjvR+GNBRGQy0WGONNdh///257bbbytq22247hg4dCsCQIUNo3779Qo/RpUsXBg0axPTp0wH46quvytZgOnbsyFdffbXY8rRv35777ruP2bNnM2XKFF588UXatm3LDjvsUNY+efJkRowYUbZPw4YNGTNmDAAPPPBAWXunTp248cYbyz7/8MMPACy33HLMnDlzsWUKgiBbLOkaz2ZA+2QC+4+kNql9PeDLvH6TUtuC2tcEfjSzWeXa5zlW2j4t9Z8PSX0kjZY0esqUKUv4k4rH6aefXrY4D3D99ddz++2307x5c+666y6uu+66he7fuXNnDj74YLbddluaNWvGvvvuy88//8ycOXOYMGECa6yxxmLLstdee9G8eXNatGhBhw4duOqqq/jTn/7EXnvtxaabbkrjxo3p2bMn2267bdk+559/PieffDKtW7emZs2aZe1//etf+eGHH2jatCktWrQoU1Z9+vShefPm4VwQBCWKcuaahXby9ZVHzaxp+jweGAGcBLQB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e+9dYAqdfC666CJ22WWXhfapDorn0EMP5aabbiq2GEFQsvxhxSNpReAc4LxlL07FpNnQAiNdzWygmbU2s9aLk025GFSVsggA7du354033mDmzJlMnz6dCRMm0LJly7LtF110EW3atKFp06b06dOHXJBxfkG4hg0bcv7557P11lvTrFkzPvjgAyZOnMgtt9xC//79admyJSNHjmTKlCnss88+tGnThjZt2pTV7bngggvo3bs3O+20ExtttBEDBgwo+/4ePXrQqlUrmjRpwsCBA8vaV155Zc4991xatGhBu3bt+OabbwD45ptv2GuvvWjRogUtWrQoU3x33303bdu2pWXLlhx99NHMnj0bgD333JN777138f5xQRAsc5ZkxrMx0Ah4W9JEoAHwpqQ/AV8B6+f1bZDaFtbeoIJ2gG+SKY7099slkLVKUJXKIoBnlt5ll1146qmneOSRR9hzzz3n2X7CCScwatQoxo8fz6+//rrAYNR69erx5ptvcuyxx3LNNdfQsGFDjjnmmLJicu3bt+fkk0/m1FNPZdSoUTzwwAMceeSRZft/8MEHPPXUU7zxxhtceOGFzJw5E/DZ4ZgxYxg9ejQDBgzg+++/B+B///sf7dq14+2332aHHXbg1ltvBeCkk05ixx135O233+bNN9+kSZMmvP/++9x33328/PLLjB07lpo1a5bVDKpbty6//fZb2XGDICgsfziA1MzeAdbKfU7Kp7WZfSdpOHCCpKG4c8E0M5ss6SngsjzPtM7A2WY2VdJPktrhzgU9getTn+FAL+CK9PeRJfqFVYCqWBbhwAMPZMCAAUybNo2//e1vXHbZZWXbRowYwVVXXcUvv/zC1KlTadKkCXvsscd8x9h7770BaNWqFQ8++GCF3/Pss8/y3nvvlX3+6aefmD59OgC77bYbtWvXpnbt2qy11lp88803NGjQgAEDBvDQQw8B8OWXX/Lxxx+z5pprsvzyy7P77ruXfeczzzwDwPPPP8+dd7rvS82aNVlttdW46667GDNmDG3atAF8jW2ttcou27JSDhXlswuCoHJZpOKRdC+wE1BP0iTgfDO7bQHdHwd2BSYAvwCHAyQFczEwKvW7yMxyDgvH4Z5zdXBvtidS+xXA/ZKOAD4H9v9Dv6wKUZXKIuRo27Yt77zzDiuuuCKbbbZZWfuMGTM47rjjGD16NOuvvz4X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yQCMGzdukfsMHDiQqVOnUrNmTXbaaSeaNm3Kuuuuu8xkmjVrVlkOuvL07t2b7bffnt69ey+z7wuCoLhE5oICUVXKIkyePJkGDRqUfW7evDnged/69u1L06ZNadasGffddx/gtXamT59Oq1atuO+++xg9ejSHHHIILVu2ZOTIkWXK8pFHHqFOnTr8/vvvzJgxg4022giAW2+9lTZt2tCiRQv22WcffvnFLbOHHXYYxxxzDNtssw1nnnkmn3zyCV27dqVVq1a0b9++rORClEsIguwRiqcAVKWyCMcffzxHHHEEO++8M5deemmZ2ezBBx9k7NixvP322zz77LP07duXyZMnM3z4cOrUqcPYsWM54IADaN26NUOGDGHs2LFsu+22ZYlOR44cSdOmTRk1ahSvv/4622yzDeDZrEeNGsXbb7/NlltuyW23zZ0sT5o0iVdeeYVrr72WPn36cP311zNmzBiuueYajjvuuLJ+US4hCLJFSSYJLTQLK4sgie7du9OtWzcGDx680LIIxxxzzDxlEcaPH19WFgF8VrTOOussVJYuXbrw6aef8uSTT/LEE0+w1VZbMX78eF566SUOOuggatasydprr82OO+7IqFGj5qnVU55atWqx8cYb8/777/PGG29w2mmn8eKLLzJ79mzat28PwPjx4/nrX//Kjz/+yPTp0+nSpUvZ/vvttx81a9Zk+vTpvPLKK+y331zLaq74HHi5hNwMKAiC6k8ongJQ1coirLHGGhx88MEcfPDB7L777vPUyPmj7LDDDjzxxBMst9xy7LLLLhx22GHMnj2bq6++GnCT2sMPP0yLFi0YPHgwL7zwQtm+ud86Z84cVl999QrPB0S5hCDIGiWpeArt/lyVyiI8//zztGvXjhVXXJGff/6ZTz75hA022ID27dvzj3/8g169ejF16lRefPHFMuWRT37ZA/Ay2j179qRnz57Ur1+f77//nm+++aZsbernn39mnXXWYebMmQwZMoT11ltvvmOuuuqqNGrUiH/961/st99+mBnjxo2jRYsWQJRLCIKsEWs8BaKqlEUYM2YMrVu3pnnz5my77bYceeSRtGnThr322qvs2B06dOCqq67iT3/603z755wCWrZsya+//so222zDN998ww477AC4s0KzZs3IpdW7+OKL2Wabbdh+++3ZYostFvj7hgwZwm233UaLFi1o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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-01-12T18:11:43.929293\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " columns=[\"Product\"],\n", " aggfunc='sum',\n", " fill_value=0\n", " )\n", " .plot(\n", " kind='bar', \n", " rot=45\n", " )\n", ");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple Aggregation Functions\n", "\n", "You can define multiple Aggregation functions for a value or different Aggregation functions for different values. You can either pass an array of function or a dictionary for different columns." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PriceQuantity
mediansumsum
ProductCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftwareCPUMaintenanceMonitorSoftware
ManagerRep
Debra HenleyCraig Booker3250050000100006500050000100002201
Daniel Hilton52500001000010500000100004001
John Smith35000500000350005000001200
Fred AndersonCedric Moss4750050000100009500050000100003101
Wendy Yule825007000500001650007000500007320
\n", "
" ], "text/plain": [ " Price \\\n", " median sum \n", "Product CPU Maintenance Monitor Software CPU \n", "Manager Rep \n", "Debra Henley Craig Booker 32500 5000 0 10000 65000 \n", " Daniel Hilton 52500 0 0 10000 105000 \n", " John Smith 35000 5000 0 0 35000 \n", "Fred Anderson Cedric Moss 47500 5000 0 10000 95000 \n", " Wendy Yule 82500 7000 5000 0 165000 \n", "\n", " Quantity \\\n", " sum \n", "Product Maintenance Monitor Software CPU Maintenance \n", "Manager Rep \n", "Debra Henley Craig Booker 5000 0 10000 2 2 \n", " Daniel Hilton 0 0 10000 4 0 \n", " John Smith 5000 0 0 1 2 \n", "Fred Anderson Cedric Moss 5000 0 10000 3 1 \n", " Wendy Yule 7000 5000 0 7 3 \n", "\n", " \n", " \n", "Product Monitor Software \n", "Manager Rep \n", "Debra Henley Craig Booker 0 1 \n", " Daniel Hilton 0 1 \n", " John Smith 0 0 \n", "Fred Anderson Cedric Moss 0 1 \n", " Wendy Yule 2 0 " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\",\"Quantity\"],\n", " columns=[\"Product\"],\n", " aggfunc={ \n", " \"Price\" :['sum','median'],\n", " \"Quantity\" : 'sum'\n", " },\n", " fill_value=0\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Format the values\n", "\n", "A pivot table is simply a dataframe in Pandas and you can format the values similar to the formating of any other dataframe. We will cover Styling in a dedicated section, however, here is a quick preview to formating the the _Price_ column as currency" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Price
Manager Rep
Debra HenleyCraig Booker$80,000
Daniel Hilton$115,000
John Smith$40,000
Fred AndersonCedric Moss$110,000
Wendy Yule$177,000
" ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " sales_funnel\n", " .pivot_table(\n", " index=[\"Manager\",\"Rep\"], \n", " values=[\"Price\"],\n", " aggfunc='sum',\n", " fill_value=0\n", " )\n", " .style\n", " .format({'Price':'${0:,.0f}'})\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.8.3-final" }, "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 }