├── img └── netflix_median.png ├── data ├── user_ex_python.csv └── user_ex.csv ├── LICENSE ├── README.md ├── .gitignore ├── environment.yml ├── data_generation.ipynb └── hierarchical_indices_multiple_groupbys_and_pandas.ipynb /img/netflix_median.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/community-hierarchical-indices/master/img/netflix_median.png -------------------------------------------------------------------------------- /data/user_ex_python.csv: -------------------------------------------------------------------------------- 1 | date,language,ex_complete 2 | 2017-01-01,python,6 3 | 2017-01-02,python,5 4 | 2017-01-03,python,10 5 | -------------------------------------------------------------------------------- /data/user_ex.csv: -------------------------------------------------------------------------------- 1 | date,language,ex_complete 2 | 2017-01-01,python,6 3 | 2017-01-02,python,5 4 | 2017-01-03,python,10 5 | 2017-01-01,r,8 6 | 2017-01-02,r,8 7 | 2017-01-03,r,8 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 DataCamp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # community-hierarchical-indices 2 | This repository contains notebook + code for DataCamp community post on hierarchical indices, groupby, split-apply-combine and pandas. 3 | 4 | ## Getting set up 5 | 6 | Clone this repository 7 | 8 | ``` 9 | git clone https://github.com/datacamp/community-hierarchical-indices 10 | ``` 11 | 12 | If you do not already have the [Anaconda distribution](https://www.anaconda.com/download/), go get it (n.b., you can also do this w/out Anaconda using `pip` to install the required packages, however Anaconda is great for Data Science and I encourage you to use it). 13 | 14 | Navigate to the relevant directory `community-hierarchical-indices` and install required packages in a new conda environment: 15 | 16 | ``` 17 | conda env create -f environment.yml 18 | ``` 19 | 20 | This will create a new environment called hierarchical-indices-pandas. To activate the environment, execute 21 | 22 | ``` 23 | source activate hierarchical-indices 24 | ``` 25 | 26 | Then open the notebook `hierarchical_indices_multiple_groupbys_and_pandas.ipynb` and execute the code. 27 | 28 | 29 | ### Code 30 | The code in this repository is released under the [MIT license](LICENSE). Read more at the [Open Source Initiative](https://opensource.org/licenses/MIT). All text remains the Intellectual Property of DataCamp. If you wish to reuse, adapt or remix, get in touch with me at hugo at datacamp com to request permission. 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: hierarchical-indices 2 | channels: 3 | - defaults 4 | dependencies: 5 | - appnope=0.1.0=py36_0 6 | - bleach=1.5.0=py36_0 7 | - certifi=2016.2.28=py36_0 8 | - decorator=4.1.2=py36_0 9 | - entrypoints=0.2.3=py36_0 10 | - html5lib=0.999=py36_0 11 | - icu=54.1=0 12 | - ipykernel=4.6.1=py36_0 13 | - ipython=6.1.0=py36_0 14 | - ipython_genutils=0.2.0=py36_0 15 | - ipywidgets=6.0.0=py36_0 16 | - jedi=0.10.2=py36_2 17 | - jinja2=2.9.6=py36_0 18 | - jsonschema=2.6.0=py36_0 19 | - jupyter=1.0.0=py36_3 20 | - jupyter_client=5.1.0=py36_0 21 | - jupyter_console=5.2.0=py36_0 22 | - jupyter_core=4.3.0=py36_0 23 | - markupsafe=1.0=py36_0 24 | - mistune=0.7.4=py36_0 25 | - mkl=2017.0.3=0 26 | - nbconvert=5.2.1=py36_0 27 | - nbformat=4.4.0=py36_0 28 | - notebook=5.0.0=py36_0 29 | - numpy=1.13.1=py36_0 30 | - openssl=1.0.2l=0 31 | - pandas=0.20.3=py36_0 32 | - pandocfilters=1.4.2=py36_0 33 | - path.py=10.3.1=py36_0 34 | - pexpect=4.2.1=py36_0 35 | - pickleshare=0.7.4=py36_0 36 | - pip=9.0.1=py36_1 37 | - prompt_toolkit=1.0.15=py36_0 38 | - ptyprocess=0.5.2=py36_0 39 | - pygments=2.2.0=py36_0 40 | - pyqt=5.6.0=py36_2 41 | - python=3.6.2=0 42 | - python-dateutil=2.6.1=py36_0 43 | - pytz=2017.2=py36_0 44 | - pyzmq=16.0.2=py36_0 45 | - qt=5.6.2=2 46 | - qtconsole=4.3.1=py36_0 47 | - readline=6.2=2 48 | - setuptools=36.4.0=py36_0 49 | - simplegeneric=0.8.1=py36_1 50 | - sip=4.18=py36_0 51 | - six=1.10.0=py36_0 52 | - sqlite=3.13.0=0 53 | - terminado=0.6=py36_0 54 | - testpath=0.3.1=py36_0 55 | - tk=8.5.18=0 56 | - tornado=4.5.2=py36_0 57 | - traitlets=4.3.2=py36_0 58 | - wcwidth=0.1.7=py36_0 59 | - wheel=0.29.0=py36_0 60 | - widgetsnbextension=3.0.2=py36_0 61 | - xz=5.2.3=0 62 | - zlib=1.2.11=0 63 | - pip: 64 | - ipython-genutils==0.2.0 65 | - jupyter-client==5.1.0 66 | - jupyter-console==5.2.0 67 | - jupyter-core==4.3.0 68 | - prompt-toolkit==1.0.15 69 | prefix: /Users/hugobowne/anaconda/envs/group-by-pandas-netflix 70 | -------------------------------------------------------------------------------- /data_generation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Data synthesis/generation for hierarchical index post" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "# Import packages\n", 19 | "import numpy as np\n", 20 | "import pandas as pd" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": { 27 | "collapsed": true 28 | }, 29 | "outputs": [], 30 | "source": [ 31 | "# Generate data \n", 32 | "t = pd.date_range(start='1/1/2017', end='1/3/2017')\n", 33 | "python = np.random.poisson(10, len(t))\n", 34 | "r = np.random.poisson(10, len(t))\n", 35 | "data = {'python': python, 'r': r, 'date': t}" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 3, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "text/html": [ 46 | "
\n", 47 | "\n", 60 | "\n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | "
datepythonr
02017-01-0168
12017-01-0258
22017-01-03108
\n", 90 | "
" 91 | ], 92 | "text/plain": [ 93 | " date python r\n", 94 | "0 2017-01-01 6 8\n", 95 | "1 2017-01-02 5 8\n", 96 | "2 2017-01-03 10 8" 97 | ] 98 | }, 99 | "execution_count": 3, 100 | "metadata": {}, 101 | "output_type": "execute_result" 102 | } 103 | ], 104 | "source": [ 105 | "# Build DataFrame and check it out\n", 106 | "df = pd.DataFrame(data = data)\n", 107 | "df.head()" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 4, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "text/html": [ 118 | "
\n", 119 | "\n", 132 | "\n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | "
datelanguageex_complete
02017-01-01python6
12017-01-02python5
22017-01-03python10
32017-01-01r8
42017-01-02r8
\n", 174 | "
" 175 | ], 176 | "text/plain": [ 177 | " date language ex_complete\n", 178 | "0 2017-01-01 python 6\n", 179 | "1 2017-01-02 python 5\n", 180 | "2 2017-01-03 python 10\n", 181 | "3 2017-01-01 r 8\n", 182 | "4 2017-01-02 r 8" 183 | ] 184 | }, 185 | "execution_count": 4, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "# Melt the DataFrame inplace\n", 192 | "df = df.melt(id_vars='date', var_name='language', value_name='ex_complete')\n", 193 | "df.head()" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 5, 199 | "metadata": { 200 | "collapsed": true 201 | }, 202 | "outputs": [], 203 | "source": [ 204 | "# Export data\n", 205 | "df.to_csv('data/user_ex.csv', index=False)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "___" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 6, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "data": { 222 | "text/html": [ 223 | "
\n", 224 | "\n", 237 | "\n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | "
datelanguageex_complete
02017-01-01python6
12017-01-02python5
22017-01-03python10
32017-01-01r8
42017-01-02r8
\n", 279 | "
" 280 | ], 281 | "text/plain": [ 282 | " date language ex_complete\n", 283 | "0 2017-01-01 python 6\n", 284 | "1 2017-01-02 python 5\n", 285 | "2 2017-01-03 python 10\n", 286 | "3 2017-01-01 r 8\n", 287 | "4 2017-01-02 r 8" 288 | ] 289 | }, 290 | "execution_count": 6, 291 | "metadata": {}, 292 | "output_type": "execute_result" 293 | } 294 | ], 295 | "source": [ 296 | "# Import data, chek out head\n", 297 | "df = pd.read_csv('data/user_ex.csv')\n", 298 | "df.head()" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 7, 304 | "metadata": {}, 305 | "outputs": [ 306 | { 307 | "data": { 308 | "text/html": [ 309 | "
\n", 310 | "\n", 323 | "\n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | "
datelanguageex_complete
12017-01-02python5
22017-01-03python10
32017-01-01r8
42017-01-02r8
52017-01-03r8
\n", 365 | "
" 366 | ], 367 | "text/plain": [ 368 | " date language ex_complete\n", 369 | "1 2017-01-02 python 5\n", 370 | "2 2017-01-03 python 10\n", 371 | "3 2017-01-01 r 8\n", 372 | "4 2017-01-02 r 8\n", 373 | "5 2017-01-03 r 8" 374 | ] 375 | }, 376 | "execution_count": 7, 377 | "metadata": {}, 378 | "output_type": "execute_result" 379 | } 380 | ], 381 | "source": [ 382 | "# Check out tail\n", 383 | "df.tail()" 384 | ] 385 | }, 386 | { 387 | "cell_type": "code", 388 | "execution_count": 8, 389 | "metadata": { 390 | "collapsed": true 391 | }, 392 | "outputs": [], 393 | "source": [ 394 | "# Select rows corres. to Python\n", 395 | "df_python = df[df['language'] == 'python']" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 9, 401 | "metadata": { 402 | "collapsed": true 403 | }, 404 | "outputs": [], 405 | "source": [ 406 | "# Export python\n", 407 | "df_python.to_csv('data/user_ex_python.csv', index=False)" 408 | ] 409 | } 410 | ], 411 | "metadata": { 412 | "kernelspec": { 413 | "display_name": "Python 3", 414 | "language": "python", 415 | "name": "python3" 416 | }, 417 | "language_info": { 418 | "codemirror_mode": { 419 | "name": "ipython", 420 | "version": 3 421 | }, 422 | "file_extension": ".py", 423 | "mimetype": "text/x-python", 424 | "name": "python", 425 | "nbconvert_exporter": "python", 426 | "pygments_lexer": "ipython3", 427 | "version": "3.6.2" 428 | } 429 | }, 430 | "nbformat": 4, 431 | "nbformat_minor": 2 432 | } 433 | -------------------------------------------------------------------------------- /hierarchical_indices_multiple_groupbys_and_pandas.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "In a [previous post](https://www.datacamp.com/community/tutorials/pandas-split-apply-combine-groupby), you saw how the groupby operation arises naturally through the lens of the principle of split-apply-combine. You checked out a dataset of Netflix user ratings and grouped the rows by the release year of the movie to generate the following figure:" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "

\n", 15 | "\n", 16 | "

" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "This was achieved via grouping by a single column. I mentioned, in passing, that you may want to group by several columns, in which case the resulting pandas DataFrame ends up with a multi-index _or_ hierarchical index. In this post, you'll learn what _hierarchical indices_ and see how they arise when grouping by several features of your data. You can find out more about all of these concept and practices in our [Manipulating DataFrames with pandas course](https://www.datacamp.com/courses/manipulating-dataframes-with-pandas), taught by Dhavide Aruliah of Anaconda Inc. (I also had the great pleasure of working on this course with Dhavide and his team).\n", 24 | "\n", 25 | "\n", 26 | "So first up: what are hierarchical indices?" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Hierarchical indices and pandas DataFrames" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "### What is the index of a DataFrame?" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "Before introducing hierarchical indices, I want you to recall what the index of pandas DataFrame is. The index of a DataFrame is a set that consists of a label for each row. Let's look at an example. I'll first import a synthetic dataset of a hypothetical DataCamp student Ellie's activity on DataCamp. The columns are a date, a programming language and the number of exercises that Ellie completed that day in that language. Load in the data:" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 1, 53 | "metadata": {}, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "text/html": [ 58 | "
\n", 59 | "\n", 72 | "\n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | "
datelanguageex_complete
02017-01-01python6
12017-01-02python5
22017-01-03python10
\n", 102 | "
" 103 | ], 104 | "text/plain": [ 105 | " date language ex_complete\n", 106 | "0 2017-01-01 python 6\n", 107 | "1 2017-01-02 python 5\n", 108 | "2 2017-01-03 python 10" 109 | ] 110 | }, 111 | "execution_count": 1, 112 | "metadata": {}, 113 | "output_type": "execute_result" 114 | } 115 | ], 116 | "source": [ 117 | "# Import pandas\n", 118 | "import pandas as pd\n", 119 | "\n", 120 | "# Load in data\n", 121 | "df = pd.read_csv('data/user_ex_python.csv')\n", 122 | "df" 123 | ] 124 | }, 125 | { 126 | "cell_type": "markdown", 127 | "metadata": {}, 128 | "source": [ 129 | "You can see the Index on the left hand side of the DataFrame and that it consists of integers. This is a `RangeIndex`:" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 2, 135 | "metadata": {}, 136 | "outputs": [ 137 | { 138 | "data": { 139 | "text/plain": [ 140 | "RangeIndex(start=0, stop=3, step=1)" 141 | ] 142 | }, 143 | "execution_count": 2, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "# Check out index\n", 150 | "df.index" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "We can use this index to slice out a row or rows of `df`:" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 3, 163 | "metadata": {}, 164 | "outputs": [ 165 | { 166 | "data": { 167 | "text/html": [ 168 | "
\n", 169 | "\n", 182 | "\n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | "
datelanguageex_complete
02017-01-01python6
12017-01-02python5
\n", 206 | "
" 207 | ], 208 | "text/plain": [ 209 | " date language ex_complete\n", 210 | "0 2017-01-01 python 6\n", 211 | "1 2017-01-02 python 5" 212 | ] 213 | }, 214 | "execution_count": 3, 215 | "metadata": {}, 216 | "output_type": "execute_result" 217 | } 218 | ], 219 | "source": [ 220 | "# Slice and dice data\n", 221 | "df.loc[:1]" 222 | ] 223 | }, 224 | { 225 | "cell_type": "markdown", 226 | "metadata": {}, 227 | "source": [ 228 | "This index, however, is not so informative. If you're going to label the rows of your DataFrame, it would be good to label them in a meaningful manner, if at all possible. Can you do this with the dataset in question? A good way to think about this challenge is that you want a **unique _and_ meaningful identifier for each row**. Check out the columns and see if any matches these criteria. Notice that the `date` column contains unique dates so it makes sense to label each row by the date column. That is,you can make the `date` column the index of the DataFrame using the `.set_index()` method (n.b. `inplace=True` means you're actually altering the DataFrame `df` inplace):" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 4, 234 | "metadata": {}, 235 | "outputs": [ 236 | { 237 | "data": { 238 | "text/html": [ 239 | "
\n", 240 | "\n", 253 | "\n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | "
datelanguageex_complete
date
2017-01-012017-01-01python6
2017-01-022017-01-02python5
2017-01-032017-01-03python10
\n", 289 | "
" 290 | ], 291 | "text/plain": [ 292 | " date language ex_complete\n", 293 | "date \n", 294 | "2017-01-01 2017-01-01 python 6\n", 295 | "2017-01-02 2017-01-02 python 5\n", 296 | "2017-01-03 2017-01-03 python 10" 297 | ] 298 | }, 299 | "execution_count": 4, 300 | "metadata": {}, 301 | "output_type": "execute_result" 302 | } 303 | ], 304 | "source": [ 305 | "# Set new index\n", 306 | "df.set_index(pd.DatetimeIndex(df['date']), inplace=True)\n", 307 | "df" 308 | ] 309 | }, 310 | { 311 | "cell_type": "markdown", 312 | "metadata": {}, 313 | "source": [ 314 | "This then gives `df` a `DateTimeIndex`:" 315 | ] 316 | }, 317 | { 318 | "cell_type": "code", 319 | "execution_count": 5, 320 | "metadata": {}, 321 | "outputs": [ 322 | { 323 | "data": { 324 | "text/plain": [ 325 | "DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03'], dtype='datetime64[ns]', name='date', freq=None)" 326 | ] 327 | }, 328 | "execution_count": 5, 329 | "metadata": {}, 330 | "output_type": "execute_result" 331 | } 332 | ], 333 | "source": [ 334 | "# Check out new index\n", 335 | "df.index" 336 | ] 337 | }, 338 | { 339 | "cell_type": "markdown", 340 | "metadata": {}, 341 | "source": [ 342 | "Now you can slice out rows using the `DateTimeIndex` that you've created:" 343 | ] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": 6, 348 | "metadata": {}, 349 | "outputs": [ 350 | { 351 | "data": { 352 | "text/plain": [ 353 | "date 2017-01-02\n", 354 | "language python\n", 355 | "ex_complete 5\n", 356 | "Name: 2017-01-02 00:00:00, dtype: object" 357 | ] 358 | }, 359 | "execution_count": 6, 360 | "metadata": {}, 361 | "output_type": "execute_result" 362 | } 363 | ], 364 | "source": [ 365 | "# Slice and dice data w/ new index\n", 366 | "df.loc['2017-01-02']" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "Also note that the `.columns` attribute returns an index containg the column names of `df`:" 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "execution_count": 7, 379 | "metadata": {}, 380 | "outputs": [ 381 | { 382 | "data": { 383 | "text/plain": [ 384 | "Index(['date', 'language', 'ex_complete'], dtype='object')" 385 | ] 386 | }, 387 | "execution_count": 7, 388 | "metadata": {}, 389 | "output_type": "execute_result" 390 | } 391 | ], 392 | "source": [ 393 | "# Check out columns\n", 394 | "df.columns" 395 | ] 396 | }, 397 | { 398 | "cell_type": "markdown", 399 | "metadata": {}, 400 | "source": [ 401 | "This can be slightly confusing because this says is that `df.columns` is of type `Index`. This **does not mean** that the columns are the index of the DataFrame. The index of `df` is always given by `df.index`. Check out our [pandas DataFrames tutorial](https://www.datacamp.com/community/tutorials/pandas-tutorial-dataframe-python) for more on indices. Now it's time to meet hierarchical indices." 402 | ] 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "metadata": {}, 407 | "source": [ 408 | "### The Multi-index of a pandas DataFrame" 409 | ] 410 | }, 411 | { 412 | "cell_type": "markdown", 413 | "metadata": {}, 414 | "source": [ 415 | "What if we had multiple languages for our dataset, as we do on DataCamp? Have a look:" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 8, 421 | "metadata": {}, 422 | "outputs": [ 423 | { 424 | "data": { 425 | "text/html": [ 426 | "
\n", 427 | "\n", 440 | "\n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | "
datelanguageex_complete
02017-01-01python6
12017-01-02python5
22017-01-03python10
32017-01-01r8
42017-01-02r8
52017-01-03r8
\n", 488 | "
" 489 | ], 490 | "text/plain": [ 491 | " date language ex_complete\n", 492 | "0 2017-01-01 python 6\n", 493 | "1 2017-01-02 python 5\n", 494 | "2 2017-01-03 python 10\n", 495 | "3 2017-01-01 r 8\n", 496 | "4 2017-01-02 r 8\n", 497 | "5 2017-01-03 r 8" 498 | ] 499 | }, 500 | "execution_count": 8, 501 | "metadata": {}, 502 | "output_type": "execute_result" 503 | } 504 | ], 505 | "source": [ 506 | "# Import and check out data\n", 507 | "df = pd.read_csv('data/user_ex.csv')\n", 508 | "df" 509 | ] 510 | }, 511 | { 512 | "cell_type": "markdown", 513 | "metadata": {}, 514 | "source": [ 515 | "Each date now corresponds to several rows, one for each language. See, for example, that the date '2017-01-02' occurs in rows 1 and 4, for languages Python and R, respectively. Thus the date no longer *uniquely* specifies the row. However, 'date' and 'language' together do uniquely specify the rows. For this reason, we use both as the index:" 516 | ] 517 | }, 518 | { 519 | "cell_type": "code", 520 | "execution_count": 9, 521 | "metadata": {}, 522 | "outputs": [ 523 | { 524 | "data": { 525 | "text/html": [ 526 | "
\n", 527 | "\n", 540 | "\n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | "
ex_complete
datelanguage
2017-01-01python6
2017-01-02python5
2017-01-03python10
2017-01-01r8
2017-01-02r8
2017-01-03r8
\n", 586 | "
" 587 | ], 588 | "text/plain": [ 589 | " ex_complete\n", 590 | "date language \n", 591 | "2017-01-01 python 6\n", 592 | "2017-01-02 python 5\n", 593 | "2017-01-03 python 10\n", 594 | "2017-01-01 r 8\n", 595 | "2017-01-02 r 8\n", 596 | "2017-01-03 r 8" 597 | ] 598 | }, 599 | "execution_count": 9, 600 | "metadata": {}, 601 | "output_type": "execute_result" 602 | } 603 | ], 604 | "source": [ 605 | "# Set index\n", 606 | "df.set_index(['date', 'language'], inplace=True)\n", 607 | "df" 608 | ] 609 | }, 610 | { 611 | "cell_type": "markdown", 612 | "metadata": {}, 613 | "source": [ 614 | "You have now created a multi-index, or hierarchical index (become comfortable with both these terms as you'll find them used interchangeably), and you can see this by checking out the index as follows:" 615 | ] 616 | }, 617 | { 618 | "cell_type": "code", 619 | "execution_count": 10, 620 | "metadata": {}, 621 | "outputs": [ 622 | { 623 | "data": { 624 | "text/plain": [ 625 | "MultiIndex(levels=[['2017-01-01', '2017-01-02', '2017-01-03'], ['python', 'r']],\n", 626 | " labels=[[0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1]],\n", 627 | " names=['date', 'language'])" 628 | ] 629 | }, 630 | "execution_count": 10, 631 | "metadata": {}, 632 | "output_type": "execute_result" 633 | } 634 | ], 635 | "source": [ 636 | "# Check out multi-index\n", 637 | "df.index" 638 | ] 639 | }, 640 | { 641 | "cell_type": "markdown", 642 | "metadata": {}, 643 | "source": [ 644 | "The above tells you that your DataFrame `df` now has a `MultiIndex` with two _levels_, the first given by the date, the second by the the language. Recall that above you were able to slice the DataFrame using the index and the `.loc` accessor: `df.loc['2017-01-02']`. To be able to slice with a multi-index, you need to sort the index first:" 645 | ] 646 | }, 647 | { 648 | "cell_type": "code", 649 | "execution_count": 11, 650 | "metadata": {}, 651 | "outputs": [ 652 | { 653 | "data": { 654 | "text/html": [ 655 | "
\n", 656 | "\n", 669 | "\n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | "
ex_complete
datelanguage
2017-01-01python6
r8
2017-01-02python5
r8
2017-01-03python10
r8
\n", 712 | "
" 713 | ], 714 | "text/plain": [ 715 | " ex_complete\n", 716 | "date language \n", 717 | "2017-01-01 python 6\n", 718 | " r 8\n", 719 | "2017-01-02 python 5\n", 720 | " r 8\n", 721 | "2017-01-03 python 10\n", 722 | " r 8" 723 | ] 724 | }, 725 | "execution_count": 11, 726 | "metadata": {}, 727 | "output_type": "execute_result" 728 | } 729 | ], 730 | "source": [ 731 | "# Sort index\n", 732 | "df.sort_index(inplace=True)\n", 733 | "df" 734 | ] 735 | }, 736 | { 737 | "cell_type": "markdown", 738 | "metadata": {}, 739 | "source": [ 740 | "Now you can slice out the number of R exercises completed on 2017-01-02 by passing a tuple to the `.loc` accessor:" 741 | ] 742 | }, 743 | { 744 | "cell_type": "code", 745 | "execution_count": 12, 746 | "metadata": {}, 747 | "outputs": [ 748 | { 749 | "data": { 750 | "text/plain": [ 751 | "ex_complete 8\n", 752 | "Name: (2017-01-02, r), dtype: int64" 753 | ] 754 | }, 755 | "execution_count": 12, 756 | "metadata": {}, 757 | "output_type": "execute_result" 758 | } 759 | ], 760 | "source": [ 761 | "# Slice & dice your DataFrame\n", 762 | "df.loc[('2017-01-02', 'r')]" 763 | ] 764 | }, 765 | { 766 | "cell_type": "markdown", 767 | "metadata": {}, 768 | "source": [ 769 | "You now know a bit about hierarchical indices (or multi-indices). It's time to see how they arise when working with groupby objects." 770 | ] 771 | }, 772 | { 773 | "cell_type": "markdown", 774 | "metadata": {}, 775 | "source": [ 776 | "___" 777 | ] 778 | }, 779 | { 780 | "cell_type": "markdown", 781 | "metadata": {}, 782 | "source": [ 783 | "## Hierarchical indices, groupby objects and split-apply-combine" 784 | ] 785 | }, 786 | { 787 | "cell_type": "markdown", 788 | "metadata": {}, 789 | "source": [ 790 | "In [a previous post](https://www.datacamp.com/community/tutorials/pandas-split-apply-combine-groupby), we explored groupby objects and the data analytic principles of split-apply-combine using netflix data. Lets have a quick refresher with a different dataset, the tips dataset that is built into the `seaborn` package. 'Tips' contains features such as tip, total_bill, the day of the week and the time of day. First load and explore the data:" 791 | ] 792 | }, 793 | { 794 | "cell_type": "code", 795 | "execution_count": 13, 796 | "metadata": {}, 797 | "outputs": [ 798 | { 799 | "data": { 800 | "text/html": [ 801 | "
\n", 802 | "\n", 815 | "\n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | "
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
\n", 881 | "
" 882 | ], 883 | "text/plain": [ 884 | " total_bill tip sex smoker day time size\n", 885 | "0 16.99 1.01 Female No Sun Dinner 2\n", 886 | "1 10.34 1.66 Male No Sun Dinner 3\n", 887 | "2 21.01 3.50 Male No Sun Dinner 3\n", 888 | "3 23.68 3.31 Male No Sun Dinner 2\n", 889 | "4 24.59 3.61 Female No Sun Dinner 4" 890 | ] 891 | }, 892 | "execution_count": 13, 893 | "metadata": {}, 894 | "output_type": "execute_result" 895 | } 896 | ], 897 | "source": [ 898 | "# Import and check out data\n", 899 | "import seaborn as sns\n", 900 | "tips = sns.load_dataset(\"tips\")\n", 901 | "tips.head()" 902 | ] 903 | }, 904 | { 905 | "cell_type": "markdown", 906 | "metadata": {}, 907 | "source": [ 908 | "Note that the index of `tips` is a `RangeIndex`:" 909 | ] 910 | }, 911 | { 912 | "cell_type": "code", 913 | "execution_count": 14, 914 | "metadata": {}, 915 | "outputs": [ 916 | { 917 | "data": { 918 | "text/plain": [ 919 | "RangeIndex(start=0, stop=244, step=1)" 920 | ] 921 | }, 922 | "execution_count": 14, 923 | "metadata": {}, 924 | "output_type": "execute_result" 925 | } 926 | ], 927 | "source": [ 928 | "# Check out index\n", 929 | "tips.index" 930 | ] 931 | }, 932 | { 933 | "cell_type": "markdown", 934 | "metadata": {}, 935 | "source": [ 936 | "It always helps to do some visual EDA before diving into computation and seaborn's pairplot function allows you to get an overview of all numerical variables:" 937 | ] 938 | }, 939 | { 940 | "cell_type": "code", 941 | "execution_count": 15, 942 | "metadata": {}, 943 | "outputs": [ 944 | { 945 | "data": { 946 | "image/png": "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\n", 947 | "text/plain": [ 948 | "" 949 | ] 950 | }, 951 | "metadata": {}, 952 | "output_type": "display_data" 953 | } 954 | ], 955 | "source": [ 956 | "# Import pyplot, figures inline, set style, plot pairplot\n", 957 | "import matplotlib.pyplot as plt\n", 958 | "%matplotlib inline\n", 959 | "sns.set()\n", 960 | "sns.pairplot(tips, hue='day');" 961 | ] 962 | }, 963 | { 964 | "cell_type": "markdown", 965 | "metadata": {}, 966 | "source": [ 967 | "If you want to check out how the average tip differs between 'smokers' and 'non-smokers', you can **split** the original DataFrame by the 'smoker' (using `groupby`), **apply** the function 'mean' and **combine** into a new DataFrame:" 968 | ] 969 | }, 970 | { 971 | "cell_type": "code", 972 | "execution_count": 16, 973 | "metadata": {}, 974 | "outputs": [ 975 | { 976 | "data": { 977 | "text/html": [ 978 | "
\n", 979 | "\n", 992 | "\n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | "
total_billtipsize
smoker
Yes20.7563443.0087102.408602
No19.1882782.9918542.668874
\n", 1022 | "
" 1023 | ], 1024 | "text/plain": [ 1025 | " total_bill tip size\n", 1026 | "smoker \n", 1027 | "Yes 20.756344 3.008710 2.408602\n", 1028 | "No 19.188278 2.991854 2.668874" 1029 | ] 1030 | }, 1031 | "execution_count": 16, 1032 | "metadata": {}, 1033 | "output_type": "execute_result" 1034 | } 1035 | ], 1036 | "source": [ 1037 | "# Get mean of smoker/non-smoker groups\n", 1038 | "df = tips.groupby('smoker').mean()\n", 1039 | "df" 1040 | ] 1041 | }, 1042 | { 1043 | "cell_type": "markdown", 1044 | "metadata": {}, 1045 | "source": [ 1046 | "The resulting index of the DataFrame `df` is the 'smoker' column/feature of the original 'tips' DataFrame: " 1047 | ] 1048 | }, 1049 | { 1050 | "cell_type": "code", 1051 | "execution_count": 17, 1052 | "metadata": {}, 1053 | "outputs": [ 1054 | { 1055 | "data": { 1056 | "text/plain": [ 1057 | "CategoricalIndex(['Yes', 'No'], categories=['Yes', 'No'], ordered=False, name='smoker', dtype='category')" 1058 | ] 1059 | }, 1060 | "execution_count": 17, 1061 | "metadata": {}, 1062 | "output_type": "execute_result" 1063 | } 1064 | ], 1065 | "source": [ 1066 | "# Check out new index\n", 1067 | "df.index" 1068 | ] 1069 | }, 1070 | { 1071 | "cell_type": "markdown", 1072 | "metadata": {}, 1073 | "source": [ 1074 | "If desired, you can reset the index so that 'smoker' becomes a column of the DataFrame:" 1075 | ] 1076 | }, 1077 | { 1078 | "cell_type": "code", 1079 | "execution_count": 18, 1080 | "metadata": {}, 1081 | "outputs": [ 1082 | { 1083 | "data": { 1084 | "text/html": [ 1085 | "
\n", 1086 | "\n", 1099 | "\n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | "
smokertotal_billtipsize
0Yes20.7563443.0087102.408602
1No19.1882782.9918542.668874
\n", 1126 | "
" 1127 | ], 1128 | "text/plain": [ 1129 | " smoker total_bill tip size\n", 1130 | "0 Yes 20.756344 3.008710 2.408602\n", 1131 | "1 No 19.188278 2.991854 2.668874" 1132 | ] 1133 | }, 1134 | "execution_count": 18, 1135 | "metadata": {}, 1136 | "output_type": "execute_result" 1137 | } 1138 | ], 1139 | "source": [ 1140 | "# Reset the index\n", 1141 | "df.reset_index()" 1142 | ] 1143 | }, 1144 | { 1145 | "cell_type": "markdown", 1146 | "metadata": {}, 1147 | "source": [ 1148 | "Now it's time to find out how hierarchical indices arise from split-apply-combine and groupby operations." 1149 | ] 1150 | }, 1151 | { 1152 | "cell_type": "markdown", 1153 | "metadata": {}, 1154 | "source": [ 1155 | "### Multiple groupings and hierarchical indices" 1156 | ] 1157 | }, 1158 | { 1159 | "cell_type": "markdown", 1160 | "metadata": {}, 1161 | "source": [ 1162 | "Above, you grouped the tips dataset according to the feature 'smoker'. Sometimes you will need to group a dataset according to two features. For example, it is natural to group the tips dataset into smokers/non-smokers & dinner/lunch. To do this, you pass the column names you wish to group by as a list:" 1163 | ] 1164 | }, 1165 | { 1166 | "cell_type": "code", 1167 | "execution_count": 19, 1168 | "metadata": {}, 1169 | "outputs": [ 1170 | { 1171 | "data": { 1172 | "text/html": [ 1173 | "
\n", 1174 | "\n", 1187 | "\n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | "
total_billtipsize
smokertime
YesLunch17.3991302.8343482.217391
Dinner21.8594293.0660002.471429
NoLunch17.0508892.6737782.511111
Dinner20.0956603.1268872.735849
\n", 1233 | "
" 1234 | ], 1235 | "text/plain": [ 1236 | " total_bill tip size\n", 1237 | "smoker time \n", 1238 | "Yes Lunch 17.399130 2.834348 2.217391\n", 1239 | " Dinner 21.859429 3.066000 2.471429\n", 1240 | "No Lunch 17.050889 2.673778 2.511111\n", 1241 | " Dinner 20.095660 3.126887 2.735849" 1242 | ] 1243 | }, 1244 | "execution_count": 19, 1245 | "metadata": {}, 1246 | "output_type": "execute_result" 1247 | } 1248 | ], 1249 | "source": [ 1250 | "# Group by two columns\n", 1251 | "df = tips.groupby(['smoker','time']).mean()\n", 1252 | "df" 1253 | ] 1254 | }, 1255 | { 1256 | "cell_type": "markdown", 1257 | "metadata": {}, 1258 | "source": [ 1259 | "Looking at the above, you may be able to see that both 'smoker' and 'time' are indices of `df`. This is the case and makes sense: if grouping by 'smoker' results in the index being the original 'smoker' column, grouping by two columns will give you two indices. Check the index to confirm that it's hierarchical:" 1260 | ] 1261 | }, 1262 | { 1263 | "cell_type": "code", 1264 | "execution_count": 20, 1265 | "metadata": {}, 1266 | "outputs": [ 1267 | { 1268 | "data": { 1269 | "text/plain": [ 1270 | "MultiIndex(levels=[['Yes', 'No'], ['Lunch', 'Dinner']],\n", 1271 | " labels=[[0, 0, 1, 1], [0, 1, 0, 1]],\n", 1272 | " names=['smoker', 'time'])" 1273 | ] 1274 | }, 1275 | "execution_count": 20, 1276 | "metadata": {}, 1277 | "output_type": "execute_result" 1278 | } 1279 | ], 1280 | "source": [ 1281 | "# Check out index\n", 1282 | "df.index" 1283 | ] 1284 | }, 1285 | { 1286 | "cell_type": "markdown", 1287 | "metadata": {}, 1288 | "source": [ 1289 | "And it is. You can do a bunch of useful things now, such as getting the counts in each grouping:" 1290 | ] 1291 | }, 1292 | { 1293 | "cell_type": "code", 1294 | "execution_count": 21, 1295 | "metadata": {}, 1296 | "outputs": [ 1297 | { 1298 | "data": { 1299 | "text/plain": [ 1300 | "smoker time \n", 1301 | "Yes Lunch 23\n", 1302 | " Dinner 70\n", 1303 | "No Lunch 45\n", 1304 | " Dinner 106\n", 1305 | "dtype: int64" 1306 | ] 1307 | }, 1308 | "execution_count": 21, 1309 | "metadata": {}, 1310 | "output_type": "execute_result" 1311 | } 1312 | ], 1313 | "source": [ 1314 | "# Group by two features\n", 1315 | "tips.groupby(['smoker','time']).size()" 1316 | ] 1317 | }, 1318 | { 1319 | "cell_type": "markdown", 1320 | "metadata": {}, 1321 | "source": [ 1322 | "You can swap the levels of the hierarchical index also so that 'time' occurs before 'smoker' in the index:" 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "code", 1327 | "execution_count": 22, 1328 | "metadata": {}, 1329 | "outputs": [ 1330 | { 1331 | "data": { 1332 | "text/html": [ 1333 | "
\n", 1334 | "\n", 1347 | "\n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | "
total_billtipsize
timesmoker
LunchYes17.3991302.8343482.217391
DinnerYes21.8594293.0660002.471429
LunchNo17.0508892.6737782.511111
DinnerNo20.0956603.1268872.735849
\n", 1395 | "
" 1396 | ], 1397 | "text/plain": [ 1398 | " total_bill tip size\n", 1399 | "time smoker \n", 1400 | "Lunch Yes 17.399130 2.834348 2.217391\n", 1401 | "Dinner Yes 21.859429 3.066000 2.471429\n", 1402 | "Lunch No 17.050889 2.673778 2.511111\n", 1403 | "Dinner No 20.095660 3.126887 2.735849" 1404 | ] 1405 | }, 1406 | "execution_count": 22, 1407 | "metadata": {}, 1408 | "output_type": "execute_result" 1409 | } 1410 | ], 1411 | "source": [ 1412 | "# Swap levels of multi-index\n", 1413 | "df.swaplevel()" 1414 | ] 1415 | }, 1416 | { 1417 | "cell_type": "markdown", 1418 | "metadata": {}, 1419 | "source": [ 1420 | "You may then wish to remove one of these features from the hierarchical index and form different columns with respect to that feature. You can do so using the `unstack` method:" 1421 | ] 1422 | }, 1423 | { 1424 | "cell_type": "code", 1425 | "execution_count": 23, 1426 | "metadata": {}, 1427 | "outputs": [ 1428 | { 1429 | "data": { 1430 | "text/html": [ 1431 | "
\n", 1432 | "\n", 1445 | "\n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | "
total_billtipsize
timeLunchDinnerLunchDinnerLunchDinner
smoker
Yes17.39913021.8594292.8343483.0660002.2173912.471429
No17.05088920.0956602.6737783.1268872.5111112.735849
\n", 1493 | "
" 1494 | ], 1495 | "text/plain": [ 1496 | " total_bill tip size \n", 1497 | "time Lunch Dinner Lunch Dinner Lunch Dinner\n", 1498 | "smoker \n", 1499 | "Yes 17.399130 21.859429 2.834348 3.066000 2.217391 2.471429\n", 1500 | "No 17.050889 20.095660 2.673778 3.126887 2.511111 2.735849" 1501 | ] 1502 | }, 1503 | "execution_count": 23, 1504 | "metadata": {}, 1505 | "output_type": "execute_result" 1506 | } 1507 | ], 1508 | "source": [ 1509 | "# Unstack your multi-index\n", 1510 | "df.unstack()" 1511 | ] 1512 | }, 1513 | { 1514 | "cell_type": "markdown", 1515 | "metadata": {}, 1516 | "source": [ 1517 | "You can unstack on the outer feature of the index using the keyword argument 'level':" 1518 | ] 1519 | }, 1520 | { 1521 | "cell_type": "code", 1522 | "execution_count": 24, 1523 | "metadata": {}, 1524 | "outputs": [ 1525 | { 1526 | "data": { 1527 | "text/html": [ 1528 | "
\n", 1529 | "\n", 1542 | "\n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | " \n", 1574 | " \n", 1575 | " \n", 1576 | " \n", 1577 | " \n", 1578 | " \n", 1579 | " \n", 1580 | " \n", 1581 | " \n", 1582 | " \n", 1583 | " \n", 1584 | " \n", 1585 | " \n", 1586 | " \n", 1587 | " \n", 1588 | " \n", 1589 | "
total_billtipsize
smokerYesNoYesNoYesNo
time
Lunch17.39913017.0508892.8343482.6737782.2173912.511111
Dinner21.85942920.0956603.0660003.1268872.4714292.735849
\n", 1590 | "
" 1591 | ], 1592 | "text/plain": [ 1593 | " total_bill tip size \n", 1594 | "smoker Yes No Yes No Yes No\n", 1595 | "time \n", 1596 | "Lunch 17.399130 17.050889 2.834348 2.673778 2.217391 2.511111\n", 1597 | "Dinner 21.859429 20.095660 3.066000 3.126887 2.471429 2.735849" 1598 | ] 1599 | }, 1600 | "execution_count": 24, 1601 | "metadata": {}, 1602 | "output_type": "execute_result" 1603 | } 1604 | ], 1605 | "source": [ 1606 | "# Unsstack the outer index\n", 1607 | "df.unstack(level=0)" 1608 | ] 1609 | }, 1610 | { 1611 | "cell_type": "markdown", 1612 | "metadata": {}, 1613 | "source": [ 1614 | "The result of unstacking has a non-hierarchical index, as you may expect:" 1615 | ] 1616 | }, 1617 | { 1618 | "cell_type": "code", 1619 | "execution_count": 25, 1620 | "metadata": {}, 1621 | "outputs": [ 1622 | { 1623 | "data": { 1624 | "text/plain": [ 1625 | "CategoricalIndex(['Yes', 'No'], categories=['Yes', 'No'], ordered=False, name='smoker', dtype='category')" 1626 | ] 1627 | }, 1628 | "execution_count": 25, 1629 | "metadata": {}, 1630 | "output_type": "execute_result" 1631 | } 1632 | ], 1633 | "source": [ 1634 | "# Check out index\n", 1635 | "df.unstack().index" 1636 | ] 1637 | }, 1638 | { 1639 | "cell_type": "markdown", 1640 | "metadata": {}, 1641 | "source": [ 1642 | "As a result, you can now perform all types of data analysis with respect to these groupings. I encourage you to do so." 1643 | ] 1644 | }, 1645 | { 1646 | "cell_type": "markdown", 1647 | "metadata": {}, 1648 | "source": [ 1649 | "## Hierarchical indices in daily use" 1650 | ] 1651 | }, 1652 | { 1653 | "cell_type": "markdown", 1654 | "metadata": {}, 1655 | "source": [ 1656 | "In this post, you have been introduced to hierarchical indices (or multi-indices) and have seen how they arise as a natural consequence of wanting a DataFrame index to uniquely and meaningfully label the rows of your DataFrame. You have also seen how they arise when you need to group your data by multiple columns, invoking the principle of split-apply-combine. I hope that you have fun with hierarchical indices in your work. If you have any thoughts, responses and/or ruminations, feel free to reach out to me on twitter: [@hugobowne](https://twitter.com/hugobowne)." 1657 | ] 1658 | } 1659 | ], 1660 | "metadata": { 1661 | "kernelspec": { 1662 | "display_name": "Python 3", 1663 | "language": "python", 1664 | "name": "python3" 1665 | }, 1666 | "language_info": { 1667 | "codemirror_mode": { 1668 | "name": "ipython", 1669 | "version": 3 1670 | }, 1671 | "file_extension": ".py", 1672 | "mimetype": "text/x-python", 1673 | "name": "python", 1674 | "nbconvert_exporter": "python", 1675 | "pygments_lexer": "ipython3", 1676 | "version": "3.6.2" 1677 | } 1678 | }, 1679 | "nbformat": 4, 1680 | "nbformat_minor": 2 1681 | } 1682 | --------------------------------------------------------------------------------