From 6f8280dd875b0ebe602fe593db839f17546bbf78 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 11 Sep 2019 08:53:35 +0200 Subject: [PATCH] Add 7_reshape_table_layout.ipynb from master --- notebooks/7_reshape_table_layout.ipynb | 1654 ++++++++++++++++++++++++ 1 file changed, 1654 insertions(+) create mode 100644 notebooks/7_reshape_table_layout.ipynb diff --git a/notebooks/7_reshape_table_layout.ipynb b/notebooks/7_reshape_table_layout.ipynb new file mode 100644 index 0000000..0e103ab --- /dev/null +++ b/notebooks/7_reshape_table_layout.ipynb @@ -0,0 +1,1654 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Objectives\n", + "\n", + "- Order the rows of a table using a chosen column\n", + "- Convert to long format to plot multiple columns at the same time\n", + "- Switch between short/long table format\n", + "\n", + "Content to cover\n", + "\n", + "- sort_values\n", + "- pivot, pivot_table\n", + "- melt\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " Name Sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic = pd.read_csv(\"../data/titanic.csv\")\n", + "titanic.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Air quality data about $NO_2$ and Particulate matter less than 2.5 micrometers is used, made available by [openaq](https://openaq.org) and using the [py-openaq](http://dhhagan.github.io/py-openaq/index.html) package. The `air_quality_long.csv` data set provides $NO_2$ and $pm25$ values for the measurement stations _FR04014_, _BETR801_ and _London Westminster_ in respectively Paris, Antwerp and London. In this case, the data set is provided in a so-called long data format representation." + ] + }, + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
citycountrylocationparametervalueunit
date.utc
2019-06-18 06:00:00+00:00AntwerpenBEBETR801pm2518.0µg/m³
2019-06-17 08:00:00+00:00AntwerpenBEBETR801pm256.5µg/m³
2019-06-17 07:00:00+00:00AntwerpenBEBETR801pm2518.5µg/m³
2019-06-17 06:00:00+00:00AntwerpenBEBETR801pm2516.0µg/m³
2019-06-17 05:00:00+00:00AntwerpenBEBETR801pm257.5µg/m³
\n", + "
" + ], + "text/plain": [ + " city country location parameter value unit\n", + "date.utc \n", + "2019-06-18 06:00:00+00:00 Antwerpen BE BETR801 pm25 18.0 µg/m³\n", + "2019-06-17 08:00:00+00:00 Antwerpen BE BETR801 pm25 6.5 µg/m³\n", + "2019-06-17 07:00:00+00:00 Antwerpen BE BETR801 pm25 18.5 µg/m³\n", + "2019-06-17 06:00:00+00:00 Antwerpen BE BETR801 pm25 16.0 µg/m³\n", + "2019-06-17 05:00:00+00:00 Antwerpen BE BETR801 pm25 7.5 µg/m³" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_quality = pd.read_csv(\"../data/air_quality_long.csv\", index_col=\"date.utc\", parse_dates=True)\n", + "air_quality.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `no2` data set contains only the measurements of $NO_2$:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "no2 = air_quality[air_quality[\"parameter\"] == \"no2\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reshape the layout of tables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sort table rows" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> I want to arrange the titanic date according to the age of the passengers." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "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", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
64464513Baclini, Miss. Eugeniefemale0.7521266619.2583NaNC
46947013Baclini, Miss. Helene Barbarafemale0.7521266619.2583NaNC
787912Caldwell, Master. Alden Gatesmale0.830224873829.0000NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass Name Sex \\\n", + "803 804 1 3 Thomas, Master. Assad Alexander male \n", + "755 756 1 2 Hamalainen, Master. Viljo male \n", + "644 645 1 3 Baclini, Miss. Eugenie female \n", + "469 470 1 3 Baclini, Miss. Helene Barbara female \n", + "78 79 1 2 Caldwell, Master. Alden Gates male \n", + "\n", + " Age SibSp Parch Ticket Fare Cabin Embarked \n", + "803 0.42 0 1 2625 8.5167 NaN C \n", + "755 0.67 1 1 250649 14.5000 NaN S \n", + "644 0.75 2 1 2666 19.2583 NaN C \n", + "469 0.75 2 1 2666 19.2583 NaN C \n", + "78 0.83 0 2 248738 29.0000 NaN S " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic.sort_values(by=\"Age\").head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> I want to arrange the titanic date according to the cabin class and age in descending order." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
85185203Svensson, Mr. Johanmale74.0003470607.7750NaNS
11611703Connors, Mr. Patrickmale70.5003703697.7500NaNQ
28028103Duane, Mr. Frankmale65.0003364397.7500NaNQ
48348413Turkula, Mrs. (Hedwig)female63.00041349.5875NaNS
32632703Nysveen, Mr. Johan Hansenmale61.0003453646.2375NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass Name Sex Age \\\n", + "851 852 0 3 Svensson, Mr. Johan male 74.0 \n", + "116 117 0 3 Connors, Mr. Patrick male 70.5 \n", + "280 281 0 3 Duane, Mr. Frank male 65.0 \n", + "483 484 1 3 Turkula, Mrs. (Hedwig) female 63.0 \n", + "326 327 0 3 Nysveen, Mr. Johan Hansen male 61.0 \n", + "\n", + " SibSp Parch Ticket Fare Cabin Embarked \n", + "851 0 0 347060 7.7750 NaN S \n", + "116 0 0 370369 7.7500 NaN Q \n", + "280 0 0 336439 7.7500 NaN Q \n", + "483 0 0 4134 9.5875 NaN S \n", + "326 0 0 345364 6.2375 NaN S " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic.sort_values(by=['Pclass', 'Age'], ascending=False).head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With `sort_values`, the rows in the table are sorted according to the defined column(s). The index will follow the row order. Sorting is also possible acccording to the index labels or a combination of the values and index." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__To user guide:__ More details about sorting of tables is provided in :ref:`basics.sorting`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Long to wide table format" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's use a small subset of the air quality data set, for each location the first two measurements (i.e. the head of each group):" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "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", + "
citycountrylocationparametervalueunit
date.utc
2019-04-09 01:00:00+00:00AntwerpenBEBETR801no222.5µg/m³
2019-04-09 01:00:00+00:00ParisFRFR04014no224.4µg/m³
2019-04-09 02:00:00+00:00LondonGBLondon Westminsterno267.0µg/m³
2019-04-09 02:00:00+00:00AntwerpenBEBETR801no253.5µg/m³
2019-04-09 02:00:00+00:00ParisFRFR04014no227.4µg/m³
2019-04-09 03:00:00+00:00LondonGBLondon Westminsterno267.0µg/m³
\n", + "
" + ], + "text/plain": [ + " city country location parameter \\\n", + "date.utc \n", + "2019-04-09 01:00:00+00:00 Antwerpen BE BETR801 no2 \n", + "2019-04-09 01:00:00+00:00 Paris FR FR04014 no2 \n", + "2019-04-09 02:00:00+00:00 London GB London Westminster no2 \n", + "2019-04-09 02:00:00+00:00 Antwerpen BE BETR801 no2 \n", + "2019-04-09 02:00:00+00:00 Paris FR FR04014 no2 \n", + "2019-04-09 03:00:00+00:00 London GB London Westminster no2 \n", + "\n", + " value unit \n", + "date.utc \n", + "2019-04-09 01:00:00+00:00 22.5 µg/m³ \n", + "2019-04-09 01:00:00+00:00 24.4 µg/m³ \n", + "2019-04-09 02:00:00+00:00 67.0 µg/m³ \n", + "2019-04-09 02:00:00+00:00 53.5 µg/m³ \n", + "2019-04-09 02:00:00+00:00 27.4 µg/m³ \n", + "2019-04-09 03:00:00+00:00 67.0 µg/m³ " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no2_subset = no2.sort_index().groupby([\"location\"]).head(2)\n", + "no2_subset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](../schemas/07_pivot.svg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> I want the values for the three stations as separate columns next to each other to plot them together" + ] + }, + { + "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", + "
locationBETR801FR04014London Westminster
date.utc
2019-04-09 01:00:00+00:0022.524.4NaN
2019-04-09 02:00:00+00:0053.527.467.0
2019-04-09 03:00:00+00:00NaNNaN67.0
\n", + "
" + ], + "text/plain": [ + "location BETR801 FR04014 London Westminster\n", + "date.utc \n", + "2019-04-09 01:00:00+00:00 22.5 24.4 NaN\n", + "2019-04-09 02:00:00+00:00 53.5 27.4 67.0\n", + "2019-04-09 03:00:00+00:00 NaN NaN 67.0" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no2_subset.pivot(columns=\"location\", values=\"value\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `pivot` function is purely restructering of the data: a single value for each index/column combination is required. \n", + "\n", + "As Pandas support plotting of multiple columns (see [plotting tutorial](./4_plotting.ipynb)) out of the box, the conversion from long to wide format enables the plotting of the different time series at the same time:" + ] + }, + { + "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", + "
citycountrylocationparametervalueunit
date.utc
2019-06-21 00:00:00+00:00ParisFRFR04014no220.0µg/m³
2019-06-20 23:00:00+00:00ParisFRFR04014no221.8µg/m³
2019-06-20 22:00:00+00:00ParisFRFR04014no226.5µg/m³
2019-06-20 21:00:00+00:00ParisFRFR04014no224.9µg/m³
2019-06-20 20:00:00+00:00ParisFRFR04014no221.4µg/m³
\n", + "
" + ], + "text/plain": [ + " city country location parameter value unit\n", + "date.utc \n", + "2019-06-21 00:00:00+00:00 Paris FR FR04014 no2 20.0 µg/m³\n", + "2019-06-20 23:00:00+00:00 Paris FR FR04014 no2 21.8 µg/m³\n", + "2019-06-20 22:00:00+00:00 Paris FR FR04014 no2 26.5 µg/m³\n", + "2019-06-20 21:00:00+00:00 Paris FR FR04014 no2 24.9 µg/m³\n", + "2019-06-20 20:00:00+00:00 Paris FR FR04014 no2 21.4 µg/m³" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "no2.pivot(columns=\"location\", values=\"value\").plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \n", + "__Note__: When the `index` parameter is not defined, the existing index (row labels) is used.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__To user guide:__ For more information about `pivot`, see :ref:`reshaping.reshaping`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pivot table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](../schemas/07_pivot_table.svg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> I want the mean concentrations for $NO_2$ and $PM_{2.5}$ in each of the stations in table form" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "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", + "
parameterno2pm25
location
BETR80126.95092023.169492
FR0401429.374284NaN
London Westminster29.74005013.443568
\n", + "
" + ], + "text/plain": [ + "parameter no2 pm25\n", + "location \n", + "BETR801 26.950920 23.169492\n", + "FR04014 29.374284 NaN\n", + "London Westminster 29.740050 13.443568" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_quality.pivot_table(values=\"value\", index=\"location\", \n", + " columns=\"parameter\", aggfunc=\"mean\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the case of `pivot`, the data is only rearranged. When multiple values need to be aggregated (in this specific case, the values on different time steps) `pivot_table` can to be used, providing an aggregation function (e.g. mean) on how to combine these values." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pivot table is a well known concept in spreadsheet software. When interested in summary columns for each variable separately as well, put the `margin` parameter to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "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", + "
parameterno2pm25All
location
BETR80126.95092023.16949224.982353
FR0401429.374284NaN29.374284
London Westminster29.74005013.44356821.491708
All29.43031614.38684924.222743
\n", + "
" + ], + "text/plain": [ + "parameter no2 pm25 All\n", + "location \n", + "BETR801 26.950920 23.169492 24.982353\n", + "FR04014 29.374284 NaN 29.374284\n", + "London Westminster 29.740050 13.443568 21.491708\n", + "All 29.430316 14.386849 24.222743" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_quality.pivot_table(values=\"value\", index=\"location\", \n", + " columns=\"parameter\", aggfunc=\"mean\",\n", + " margins=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__To user guide:__ For more information about `pivot_table`, see :ref:`reshaping.pivot`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \n", + "__Note__: If you're wondering, `pivot_table` is indeed directly linked to `groupby`. The same values can be calculated by grouping on both `parameter` and `location`: \n", + "\n", + " air_quality.groupby([\"parameter\", \"location\"]).mean()\n", + " \n", + "__To user guide:__ Have a look at `groupby` in combination with `unstack` at [:ref:`TODO LABEL`](https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html#combining-with-stats-and-groupby)\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Wide to long format" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Starting again from the wide format table created in the previous section:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "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", + "
locationdate.utcBETR801FR04014London Westminster
02019-04-09 01:00:00+00:0022.524.4NaN
12019-04-09 02:00:00+00:0053.527.467.0
22019-04-09 03:00:00+00:0054.534.267.0
32019-04-09 04:00:00+00:0034.548.541.0
42019-04-09 05:00:00+00:0046.559.541.0
\n", + "
" + ], + "text/plain": [ + "location date.utc BETR801 FR04014 London Westminster\n", + "0 2019-04-09 01:00:00+00:00 22.5 24.4 NaN\n", + "1 2019-04-09 02:00:00+00:00 53.5 27.4 67.0\n", + "2 2019-04-09 03:00:00+00:00 54.5 34.2 67.0\n", + "3 2019-04-09 04:00:00+00:00 34.5 48.5 41.0\n", + "4 2019-04-09 05:00:00+00:00 46.5 59.5 41.0" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no2_pivoted = no2.pivot(columns=\"location\", values=\"value\").reset_index()\n", + "no2_pivoted.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](../schemas/07_melt.svg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> I want to collect all air quality $NO_2$ measurements in a single column (long format)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "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", + "
date.utclocationvalue
02019-04-09 01:00:00+00:00BETR80122.5
12019-04-09 02:00:00+00:00BETR80153.5
22019-04-09 03:00:00+00:00BETR80154.5
32019-04-09 04:00:00+00:00BETR80134.5
42019-04-09 05:00:00+00:00BETR80146.5
\n", + "
" + ], + "text/plain": [ + " date.utc location value\n", + "0 2019-04-09 01:00:00+00:00 BETR801 22.5\n", + "1 2019-04-09 02:00:00+00:00 BETR801 53.5\n", + "2 2019-04-09 03:00:00+00:00 BETR801 54.5\n", + "3 2019-04-09 04:00:00+00:00 BETR801 34.5\n", + "4 2019-04-09 05:00:00+00:00 BETR801 46.5" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_2 = no2_pivoted.melt(id_vars=\"date.utc\")\n", + "no_2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The solution is the short version on how to apply `melt`. The method will _melt_ all columns NOT mentioned in `id_vars` together into two columns: A columns with the column header names and a column with the values itself. The latter column gets by default the name `value`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `melt` method can be defined in more detail:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "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", + "
date.utcid_locationNO_2
02019-04-09 01:00:00+00:00BETR80122.5
12019-04-09 02:00:00+00:00BETR80153.5
22019-04-09 03:00:00+00:00BETR80154.5
32019-04-09 04:00:00+00:00BETR80134.5
42019-04-09 05:00:00+00:00BETR80146.5
\n", + "
" + ], + "text/plain": [ + " date.utc id_location NO_2\n", + "0 2019-04-09 01:00:00+00:00 BETR801 22.5\n", + "1 2019-04-09 02:00:00+00:00 BETR801 53.5\n", + "2 2019-04-09 03:00:00+00:00 BETR801 54.5\n", + "3 2019-04-09 04:00:00+00:00 BETR801 34.5\n", + "4 2019-04-09 05:00:00+00:00 BETR801 46.5" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_2 = no2_pivoted.melt(id_vars=\"date.utc\", \n", + " value_vars=[\"BETR801\", \"FR04014\", \"London Westminster\"],\n", + " value_name=\"NO_2\",\n", + " var_name=\"id_location\")\n", + "no_2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result in the same, but in more detail defined:\n", + "\n", + "- `value_vars` defines explicitly which columns to _melt_ together\n", + "- `value_name` provides a custom column name for the values column instead of the default columns name `value`\n", + "- `var_name` provides a custom olumn name for the columns collecting the column header names. Otherwise it takes the index name or a default `variable`\n", + "\n", + "Hence, the arguments `value_name` and `var_name` are just user-defined names for the two generated columns. The columns to melt are defined by `id_vars` and `value_vars`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \n", + "__Note__: The long format is also referred to as [_tidy_ data format](https://www.jstatsoft.org/article/view/v059i10). The representation defines that each observation is on a separate line and each variable a separate column. \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__To user guide:__ Conversion from wide to long format with `melt` is explained in :ref:`reshaping.melt`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## REMEMBER\n", + "\n", + "- Sorting by one or more columns is supported by `sort_values`\n", + "- The `pivot` function is purely restructering of the data, `pivot_table` supports aggregations\n", + "- The reverse of `pivot` (long to wide format) is `melt` (wide to long format)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__To user guide:__ More information on reshaping and pivoting is provided in :ref:`reshaping`." + ] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}