{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 06 -- Hierarchical Indexing" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Topics Covered\n", "\n", "MultiIndexing \n", " \n", "Multi-Indexed Selection \n", " \n", " xs() method for cross sections \n", " \n", " Advanced Indexing with .loc indexer\n", "\n", " Using Boolean operators with .loc indexer \n", "\n", " stack() and unstack() methods \n", "\n", " Resources " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from pandas import Series, DataFrame, Index\n", "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simply put, a MultiIndex (also referred to as a hierarchical index) allows multiple index levels within a single index. Higher dimensional data can be represented in a one-dimensional Series or a two-dimensional DataFrame. Start with the creation of a synthetic DataFrame whose values are used to represent the number of traffic violations issued in cell #3 below. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas provide constructor methods allowing components to be defined separately. The construction of the index and columns below is self-explanatory.\n", "\n", "For the data component: The first data = assignment constructs an array using numpy's random number generator with the round() method used to return the integer portion. The second date = assignment multiples the array of integers by 100 and floor divides by 5, and finally taking the absolute value.\n", "\n", "The tickets = assignment constructs the DataFrame from the constituents." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MultiIndexing" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "index = pd.MultiIndex.from_product([[2012, 2013, 2014, 2015], ['1', '2', '3']],\n", " names=['year', 'month'])\n", "columns=pd.MultiIndex.from_product([['city', 'suburbs', 'rural'], ['day', 'night']],\n", " names=['area', 'when'])\n", "\n", "data = np.round(np.random.randn(12, 6),2)\n", "data = abs(np.floor_divide(data[:] * 100, 5))\n", "\n", "tickets = pd.DataFrame(data, index=index, columns=columns).sort_index().sort_index(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "MultiIndex(levels=[[2012, 2013, 2014, 2015], ['1', '2', '3']],\n", " labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]],\n", " names=['year', 'month'])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how the MultiIndex displayed above contains multiple levels of indexing, in this case 'year' and 'month' along the row dimension. The levels act as labels for each data value encoding these names.\n", "\n", "In SAS, the terminology is 'month' nested within 'year'. Said another way, 'month' is the inner-most level of the index." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "MultiIndex(levels=[['city', 'rural', 'suburbs'], ['day', 'night']],\n", " labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]],\n", " names=['area', 'when'])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similiarly, the indexing for columns contains multiple levels, with the name 'area' labeling the outer levels 'city', 'rural', and 'suburbs'. 'when' is the name for the inner levels 'day' and 'night'." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
areacityruralsuburbs
whendaynightdaynightdaynight
yearmonth
2012139.018.020.07.012.09.0
212.025.03.017.07.030.0
313.027.034.032.012.030.0
201312.07.012.09.030.051.0
237.010.02.00.08.028.0
317.017.017.020.015.018.0
2014116.042.025.020.014.08.0
227.09.08.051.05.02.0
39.033.013.011.026.015.0
201513.021.07.08.033.034.0
21.02.024.07.02.02.0
313.02.01.019.01.01.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "year month \n", "2012 1 39.0 18.0 20.0 7.0 12.0 9.0\n", " 2 12.0 25.0 3.0 17.0 7.0 30.0\n", " 3 13.0 27.0 34.0 32.0 12.0 30.0\n", "2013 1 2.0 7.0 12.0 9.0 30.0 51.0\n", " 2 37.0 10.0 2.0 0.0 8.0 28.0\n", " 3 17.0 17.0 17.0 20.0 15.0 18.0\n", "2014 1 16.0 42.0 25.0 20.0 14.0 8.0\n", " 2 27.0 9.0 8.0 51.0 5.0 2.0\n", " 3 9.0 33.0 13.0 11.0 26.0 15.0\n", "2015 1 3.0 21.0 7.0 8.0 33.0 34.0\n", " 2 1.0 2.0 24.0 7.0 2.0 2.0\n", " 3 13.0 2.0 1.0 19.0 1.0 1.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(12, 6)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another SAS-like way to think of a MultiIndex is nested group-by's illustrated in cell below with PROC SORT. The resulting SAS data set tickets is 'tall' and 'skinny' with one observation for each of the nested levels. \n", "\n", "Below, we will illustrate how 'stacking' the DataFrame can be used to reshape it to a form similiar to the SAS data set tickets.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /******************************************************/\n", " /* c06_tickets_proc_sort.sas */\n", " /******************************************************/\n", " 34 proc sort;\n", " 35 by year month area nd;\n", " NOTE: 72 observations were read from \"WORK.tickets\"\n", " NOTE: Data set \"WORK.tickets\" has 72 observation(s) and 5 variable(s)\n", "````" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A SAS analog of the tickets Dataframe is rendered using PROC TABULATE. Unlike the DataFrame methods illustrated here, the physical shape of the SAS data set is not changed. In this case PROC TABULATE processes the 'tall' SAS data set to produce printed output shaped like the 'tickets' DataFrame." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "````\n", " /******************************************************/\n", " /* c06_tickets_proc_tabulate.sas */\n", " /******************************************************/\n", " 12 data tickets;\n", " 13 length area $ 7;\n", " 14 call streaminit(time());\n", " 15 do year = 2012 to 2015;\n", " 16 do month = 1 to 3;\n", " 17 do area = 'City', 'Suburbs', 'Rural';\n", " 18 do nd = 'Night', 'Day';\n", " 19 tickets = abs(int(rand( 'NORMAL')*100));\n", " 20 output;\n", " 21 end;\n", " 22 end;\n", " 23 end;\n", " 24 end;\n", " 25 proc tabulate;\n", " 26 var tickets;;\n", " 27 class area nd year month;\n", " 28 table year * month ,\n", " 29 area=' ' * nd=' ' * sum=' ' * tickets=' ';\n", "````" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA\nAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhbmR5AAAFkAMAAgAA\nABQAABCekAQAAgAAABQAABCykpEAAgAAAAMzOAAAkpIAAgAAAAMzOAAA6hwABwAACAwAAAiSAAAA\nABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAMjAxNjoxMDoyNCAyMToyNzowMgAyMDE2OjEwOjI0IDIxOjI3OjAyAAAAcgBhAG4A\nZAB5AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv\nu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i\nYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5\nOS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6\nZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1\ncmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp\nZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov\nL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMTAtMjRUMjE6Mjc6\nMDIuMzgwPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u\nIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht\nbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk\nZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt\nbnMjIj48cmRmOmxpPnJhbmR5PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv\ncmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b\nAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsa\nIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKv/AABEIAVcBYAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA\nAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU\nMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl\nZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK\n0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG\nBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS\n8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4\neXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri\n4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZo/EmovGrYtRuAOPKb/wCKp3/CRaj6Wv8A\n36b/AOKrIg/494/9wfyqSuxU4W2OV1JX3NP/AISLUfS1/wC/Tf8AxVH/AAkWo+lr/wB+m/8AiqzK\nKfsodhe0l3NP/hItR9LX/v03/wAVR/wkWo+lr/36b/4qsyij2UOwe0l3NP8A4SLUfS1/79N/8VR/\nwkWo+lr/AN+m/wDiqzKKPZQ7B7SXc0/+Ei1H0tf+/Tf/ABVH/CRaj6Wv/fpv/iqzKKPZQ7B7SXc0\n/wDhItR9LX/v03/xVNXxJqLM4xa/Kcf6pueAf73vWdUcf+sl/wB//wBlFL2cOw/aS7mv/wAJFqPp\na/8Afpv/AIqj/hItR9LX/v03/wAVWZRT9lDsL2ku5p/8JFqPpa/9+m/+Ko/4SLUfS1/79N/8VWZX\nAXl14r8U+JtXsvDWuQ6DaaOywFjZpcPcysgY53fcUZAGPfr2lwgug1OT6nqX/CRaj6Wv/fpv/iqP\n+Ei1H0tf+/Tf/FV5XfeKfEmkyaNa6hYrLrE+nXU8trbXCLA8kYBAJZC3Q54cAHP3uKh8IfEbUruy\n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\nXV9rCMAlSCOig9RRRRdgf//Z\n", "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename='Anaconda3\\\\output\\\\tabulate.JPG')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multi-Indexed Selection\n", "\n", "The tickets DataFrame is essentially four-dimensional with area nested within when for columns, and month nested within year for rows. The multi-indexing for both rows and columns make sub-setting operations straightforward. In this case, selecting by the index label 'rural' returns an entire DataFrame. Strictly speaking, 'rural' is a level in the column MultiIndex illustrated in cell #5 above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select all rows by the 'rural' level." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "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", "
whendaynight
yearmonth
2012120.07.0
23.017.0
334.032.0
2013112.09.0
22.00.0
317.020.0
2014125.020.0
28.051.0
313.011.0
201517.08.0
224.07.0
31.019.0
\n", "
" ], "text/plain": [ "when day night\n", "year month \n", "2012 1 20.0 7.0\n", " 2 3.0 17.0\n", " 3 34.0 32.0\n", "2013 1 12.0 9.0\n", " 2 2.0 0.0\n", " 3 17.0 20.0\n", "2014 1 25.0 20.0\n", " 2 8.0 51.0\n", " 3 13.0 11.0\n", "2015 1 7.0 8.0\n", " 2 24.0 7.0\n", " 3 1.0 19.0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets['rural']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select all rows for tickets issued in the city at night." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "year month\n", "2012 1 18.0\n", " 2 25.0\n", " 3 27.0\n", "2013 1 7.0\n", " 2 10.0\n", " 3 17.0\n", "2014 1 42.0\n", " 2 9.0\n", " 3 33.0\n", "2015 1 21.0\n", " 2 2.0\n", " 3 2.0\n", "Name: (city, night), dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets['city', 'night']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Multiple keys can be specified. Above, the request is for those tickets issued at 'night' in the 'city'. In this instance a Series is returned." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The examples in cells #8 and #9 work by selecting labels from 'area' which is the outer-most MultiIndex level for columns in the tickets DataFrame. Said another way, 'when' ('day' or 'night') is nested inside 'area'.\n", "\n", "Another method to select rows and columns nested inside a hierarchical index is the DataFrame xs() method. This cross-section method generally results in a smaller DataFrame than the original." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## xs() method for cross sections\n", "\n", "The DataFrame xs() method uses the level argument to select data for rows and columns. The example in the cell below selects the 1st month for each year." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
whendaynightdaynightdaynight
year
201239.018.020.07.012.09.0
20132.07.012.09.030.051.0
201416.042.025.020.014.08.0
20153.021.07.08.033.034.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "year \n", "2012 39.0 18.0 20.0 7.0 12.0 9.0\n", "2013 2.0 7.0 12.0 9.0 30.0 51.0\n", "2014 16.0 42.0 25.0 20.0 14.0 8.0\n", "2015 3.0 21.0 7.0 8.0 33.0 34.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.xs(('1'), level='month')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Likewise, you can request just the rows for 2013." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
whendaynightdaynightdaynight
month
12.07.012.09.030.051.0
237.010.02.00.08.028.0
317.017.017.020.015.018.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "month \n", "1 2.0 7.0 12.0 9.0 30.0 51.0\n", "2 37.0 10.0 2.0 0.0 8.0 28.0\n", "3 17.0 17.0 17.0 20.0 15.0 18.0" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.xs((2013), level='year')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Selections can use multiple keys. In this case, 2013 and month '1'." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
whendaynightdaynightdaynight
yearmonth
201312.07.012.09.030.051.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "year month \n", "2013 1 2.0 7.0 12.0 9.0 30.0 51.0" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.xs((2013, '1'), level=('year', 'month'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The .xs method also works for columns with the optional axis=1 (for columns) argument. In this case, the column 'night' in each of the 3 areas is selected." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
yearmonth
2012118.07.09.0
225.017.030.0
327.032.030.0
201317.09.051.0
210.00.028.0
317.020.018.0
2014142.020.08.0
29.051.02.0
333.011.015.0
2015121.08.034.0
22.07.02.0
32.019.01.0
\n", "
" ], "text/plain": [ "area city rural suburbs\n", "year month \n", "2012 1 18.0 7.0 9.0\n", " 2 25.0 17.0 30.0\n", " 3 27.0 32.0 30.0\n", "2013 1 7.0 9.0 51.0\n", " 2 10.0 0.0 28.0\n", " 3 17.0 20.0 18.0\n", "2014 1 42.0 20.0 8.0\n", " 2 9.0 51.0 2.0\n", " 3 33.0 11.0 15.0\n", "2015 1 21.0 8.0 34.0\n", " 2 2.0 7.0 2.0\n", " 3 2.0 19.0 1.0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.xs(('night'), level='when', axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Advanced Indexing with .loc indexer\n", "\n", "Chapter 5, Understanding Indexes covers the .loc indexer which can also be used with hierarchical indicies. \n", "\n", "The colon (:) to the left of the comma (,) selects all rows. The selection to the right of the comma (,) requests the levels 'city' and 'suburbs' from 'area'." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "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", "
areacitysuburbs
whendaynightdaynight
yearmonth
2012139.018.012.09.0
212.025.07.030.0
313.027.012.030.0
201312.07.030.051.0
237.010.08.028.0
317.017.015.018.0
2014116.042.014.08.0
227.09.05.02.0
39.033.026.015.0
201513.021.033.034.0
21.02.02.02.0
313.02.01.01.0
\n", "
" ], "text/plain": [ "area city suburbs \n", "when day night day night\n", "year month \n", "2012 1 39.0 18.0 12.0 9.0\n", " 2 12.0 25.0 7.0 30.0\n", " 3 13.0 27.0 12.0 30.0\n", "2013 1 2.0 7.0 30.0 51.0\n", " 2 37.0 10.0 8.0 28.0\n", " 3 17.0 17.0 15.0 18.0\n", "2014 1 16.0 42.0 14.0 8.0\n", " 2 27.0 9.0 5.0 2.0\n", " 3 9.0 33.0 26.0 15.0\n", "2015 1 3.0 21.0 33.0 34.0\n", " 2 1.0 2.0 2.0 2.0\n", " 3 13.0 2.0 1.0 1.0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[:,['city', 'suburbs']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below is a an example of partial slicing." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "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", "
areacitysuburbs
whendaynightdaynight
yearmonth
201312.07.030.051.0
237.010.08.028.0
317.017.015.018.0
2014116.042.014.08.0
227.09.05.02.0
39.033.026.015.0
\n", "
" ], "text/plain": [ "area city suburbs \n", "when day night day night\n", "year month \n", "2013 1 2.0 7.0 30.0 51.0\n", " 2 37.0 10.0 8.0 28.0\n", " 3 17.0 17.0 15.0 18.0\n", "2014 1 16.0 42.0 14.0 8.0\n", " 2 27.0 9.0 5.0 2.0\n", " 3 9.0 33.0 26.0 15.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[2013:2014, ['city', 'suburbs']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example below illustrates slicing with a range of values by providing tuples containing both the row slice ( 2nd month, 2013 to 3rd month 2014) and the column slice ('rural' 'day' to 'suburbs' 'day')." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "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", "
arearuralsuburbs
whendaynightday
yearmonth
201322.00.08.0
317.020.015.0
2014125.020.014.0
28.051.05.0
313.011.026.0
\n", "
" ], "text/plain": [ "area rural suburbs\n", "when day night day\n", "year month \n", "2013 2 2.0 0.0 8.0\n", " 3 17.0 20.0 15.0\n", "2014 1 25.0 20.0 14.0\n", " 2 8.0 51.0 5.0\n", " 3 13.0 11.0 26.0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[(2013, '2') : (2014, '3'), ('rural', 'day') : ('suburbs', 'day')]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example below illustrates the .loc() indexer using multiple keys for row and column slices." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
whendaynightdaynightdaynight
yearmonth
2013317.017.017.020.015.018.0
2014116.042.025.020.014.08.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "year month \n", "2013 3 17.0 17.0 17.0 20.0 15.0 18.0\n", "2014 1 16.0 42.0 25.0 20.0 14.0 8.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[(2013, '3'): (2014, '1')]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "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", "
whendaynight
yearmonth
2013317.017.0
2014116.042.0
\n", "
" ], "text/plain": [ "when day night\n", "year month \n", "2013 3 17.0 17.0\n", "2014 1 16.0 42.0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[(2013, '3'): (2014, '1'), \"city\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Boolean operators with .loc indexer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using boolean operators with the .loc indexer permits boolean evaluations across the Dataframe values. You can use a pd.IndexSlice to permit syntax using the colon (:) rather then slice(None) syntax when specifying ranges.\n", "\n", "The mask object returns the boolean value True which is applied to the column MultiIndex 'night' as the inner-most index level within 'city'. Notice the shape of the DataFrame is defined by just those rows in the 'night' within 'city' column construct that evaluate True." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "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", "
areacityruralsuburbs
whendaynightdaynightdaynight
yearmonth
2012313.027.034.032.012.030.0
2014116.042.025.020.014.08.0
39.033.013.011.026.015.0
\n", "
" ], "text/plain": [ "area city rural suburbs \n", "when day night day night day night\n", "year month \n", "2012 3 13.0 27.0 34.0 32.0 12.0 30.0\n", "2014 1 16.0 42.0 25.0 20.0 14.0 8.0\n", " 3 9.0 33.0 13.0 11.0 26.0 15.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "idx = pd.IndexSlice\n", "mask = tickets[('city','night')]>25\n", "tickets.loc[idx[mask,:,]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example in the cell below applies the boolean 'mask2' to all values in the DataFrame" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "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", "
areacityrural
whendaynightdaynight
yearmonth
2012139.018.020.07.0
313.027.034.032.0
2013317.017.017.020.0
2014116.042.025.020.0
201521.02.024.07.0
\n", "
" ], "text/plain": [ "area city rural \n", "when day night day night\n", "year month \n", "2012 1 39.0 18.0 20.0 7.0\n", " 3 13.0 27.0 34.0 32.0\n", "2013 3 17.0 17.0 17.0 20.0\n", "2014 1 16.0 42.0 25.0 20.0\n", "2015 2 1.0 2.0 24.0 7.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask2 = tickets[('rural', 'day')]>15\n", "tickets.loc[idx[mask2, 'city':'rurual']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example below applies boolean 'mask2' and also scopes the column request. " ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "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", "
whendaynight
yearmonth
2012120.07.0
334.032.0
2013317.020.0
2014125.020.0
2015224.07.0
\n", "
" ], "text/plain": [ "when day night\n", "year month \n", "2012 1 20.0 7.0\n", " 3 34.0 32.0\n", "2013 3 17.0 20.0\n", "2014 1 25.0 20.0\n", "2015 2 24.0 7.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tickets.loc[idx[mask2, 'rural']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## stack() and unstack() methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "DataFrames with hierarchical indices can use the .stack and .unstack attributes to reshape data from 'tall and skinny' to 'short and fat' formats and vice-versa. \n", "\n", "The .stack() attribute pivots columns into rows. The .unstack() attribute pivots rows into columns. Consider the examples in the cell below. \n", "\n", "The .unstack() attribute used without any arguments in this case pivots the 'month' rows to the inner-most index level of the columns. 'month' was the inner-most index level for rows. Also notice how we assigned the 'unstacked' DataFrame to create the new one, df_u." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
areacityruralsuburbs
whendaynightdaynightdaynight
month123123123123123123
year
201239.012.013.018.025.027.020.03.034.07.017.032.012.07.012.09.030.030.0
20132.037.017.07.010.017.012.02.017.09.00.020.030.08.015.051.028.018.0
201416.027.09.042.09.033.025.08.013.020.051.011.014.05.026.08.02.015.0
20153.01.013.021.02.02.07.024.01.08.07.019.033.02.01.034.02.01.0
\n", "
" ], "text/plain": [ "area city rural \\\n", "when day night day night \n", "month 1 2 3 1 2 3 1 2 3 1 2 3 \n", "year \n", "2012 39.0 12.0 13.0 18.0 25.0 27.0 20.0 3.0 34.0 7.0 17.0 32.0 \n", "2013 2.0 37.0 17.0 7.0 10.0 17.0 12.0 2.0 17.0 9.0 0.0 20.0 \n", "2014 16.0 27.0 9.0 42.0 9.0 33.0 25.0 8.0 13.0 20.0 51.0 11.0 \n", "2015 3.0 1.0 13.0 21.0 2.0 2.0 7.0 24.0 1.0 8.0 7.0 19.0 \n", "\n", "area suburbs \n", "when day night \n", "month 1 2 3 1 2 3 \n", "year \n", "2012 12.0 7.0 12.0 9.0 30.0 30.0 \n", "2013 30.0 8.0 15.0 51.0 28.0 18.0 \n", "2014 14.0 5.0 26.0 8.0 2.0 15.0 \n", "2015 33.0 2.0 1.0 34.0 2.0 1.0 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_u = tickets.unstack()\n", "df_u" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The MultiIndex for the columns from DataFrame df_u is shown below. Contrast this column index with the one for tickets in cell #4 above." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "MultiIndex(levels=[['city', 'rural', 'suburbs'], ['day', 'night'], ['1', '2', '3']],\n", " labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]],\n", " names=['area', 'when', 'month'])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_u.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The .stack() attribute performs the reverse operation of the .unstack() attribute. The .stack() attribute takes the inner most index level of the columns level and pivots them to the inner-most index level of the rows. In this case the new DataFrame is called df_s." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
areacityruralsuburbs
yearmonthwhen
20121day39.020.012.0
night18.07.09.0
2day12.03.07.0
night25.017.030.0
3day13.034.012.0
night27.032.030.0
20131day2.012.030.0
night7.09.051.0
2day37.02.08.0
night10.00.028.0
3day17.017.015.0
night17.020.018.0
20141day16.025.014.0
night42.020.08.0
2day27.08.05.0
night9.051.02.0
3day9.013.026.0
night33.011.015.0
20151day3.07.033.0
night21.08.034.0
2day1.024.02.0
night2.07.02.0
3day13.01.01.0
night2.019.01.0
\n", "
" ], "text/plain": [ "area city rural suburbs\n", "year month when \n", "2012 1 day 39.0 20.0 12.0\n", " night 18.0 7.0 9.0\n", " 2 day 12.0 3.0 7.0\n", " night 25.0 17.0 30.0\n", " 3 day 13.0 34.0 12.0\n", " night 27.0 32.0 30.0\n", "2013 1 day 2.0 12.0 30.0\n", " night 7.0 9.0 51.0\n", " 2 day 37.0 2.0 8.0\n", " night 10.0 0.0 28.0\n", " 3 day 17.0 17.0 15.0\n", " night 17.0 20.0 18.0\n", "2014 1 day 16.0 25.0 14.0\n", " night 42.0 20.0 8.0\n", " 2 day 27.0 8.0 5.0\n", " night 9.0 51.0 2.0\n", " 3 day 9.0 13.0 26.0\n", " night 33.0 11.0 15.0\n", "2015 1 day 3.0 7.0 33.0\n", " night 21.0 8.0 34.0\n", " 2 day 1.0 24.0 2.0\n", " night 2.0 7.0 2.0\n", " 3 day 13.0 1.0 1.0\n", " night 2.0 19.0 1.0" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_s = tickets.stack()\n", "df_s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "DataFrames containing MultiIndexes can 'stack' and 'unstack' multiple levels at a time." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_like_sas = pd.DataFrame(tickets.stack(level=['when', 'area']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can 'stack' the original tickets DataFrame by the levels 'when' and 'area' from the column MultiIndex to create a new DataFrame shaped similiarly to the SAS data set tickets. " ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(72, 1)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_like_sas.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Display the first 12 rows." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "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", "
0
yearmonthwhenarea
20121daycity39.0
rural20.0
suburbs12.0
nightcity18.0
rural7.0
suburbs9.0
2daycity12.0
rural3.0
suburbs7.0
nightcity25.0
rural17.0
suburbs30.0
\n", "
" ], "text/plain": [ " 0\n", "year month when area \n", "2012 1 day city 39.0\n", " rural 20.0\n", " suburbs 12.0\n", " night city 18.0\n", " rural 7.0\n", " suburbs 9.0\n", " 2 day city 12.0\n", " rural 3.0\n", " suburbs 7.0\n", " night city 25.0\n", " rural 17.0\n", " suburbs 30.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_like_sas.head(12)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Resources\n", "\n", " Python Data Science Handbook , Essential Tools for Working With Data, by Jake VanderPlas.\n", "\n", " Reshaping by pivoting DataFrame objects , from the pandas 0.19.0 documentation.\n", "\n", " Reshaping by stacking and unstacking from the pandas 0.19.0 documentation.\n", "\n", " MultiIndex / Advanced Indexing from the pandas 0.19.0 documentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Navigation\n", "\n", " Return to Chapter List " ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [Root]", "language": "python", "name": "Python [Root]" }, "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }