Last active
August 29, 2015 14:24
-
-
Save tgarc/6c40a65f648302b6b9d7 to your computer and use it in GitHub Desktop.
pandas: MultiIndexing with DataFrames https://nbviewer.jupyter.org/gist/tgarc/6c40a65f648302b6b9d7#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# A short tutorial on pandas MultiIndexing with DataFrames" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "pandas version: 0.16.2\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import pandas as pd\n", | |
| "import numpy as np\n", | |
| "from IPython.display import display\n", | |
| "\n", | |
| "print \"pandas version:\",pd.version.version" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"4\" valign=\"top\">a1</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"4\" valign=\"top\">a2</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>2</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>5</td>\n", | |
| " <td>1</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"4\" valign=\"top\">a3</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>1</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " <td>2</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>9</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>6</td>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"4\" valign=\"top\">a4</th>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>7</td>\n", | |
| " <td>1</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>0</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>8</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>8</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c1 2 4 3 7 5 3 6 9 0 5 8 3 6 2 3 5\n", | |
| " c2 3 4 6 6 5 6 3 2 9 8 1 8 7 0 6 0\n", | |
| " b2 c1 4 0 5 7 0 4 8 5 7 1 9 4 7 6 6 6\n", | |
| " c2 7 5 8 8 4 7 4 4 9 0 3 6 1 8 0 6\n", | |
| "a2 b1 c1 3 2 4 2 8 5 7 0 4 6 3 7 2 5 1 4\n", | |
| " c2 6 4 6 3 9 3 6 0 3 1 2 3 5 9 8 3\n", | |
| " b2 c1 8 9 0 7 9 8 0 3 7 6 1 8 9 0 3 9\n", | |
| " c2 7 4 9 7 3 7 3 8 4 5 3 1 9 4 0 3\n", | |
| "a3 b1 c1 9 0 8 0 7 5 8 2 7 8 4 3 7 2 1 7\n", | |
| " c2 4 9 5 2 1 2 3 2 7 8 9 6 5 5 9 1\n", | |
| " b2 c1 6 8 9 9 6 0 1 2 2 9 9 3 0 5 2 4\n", | |
| " c2 9 8 4 0 3 3 9 0 7 0 8 8 0 4 2 9\n", | |
| "a4 b1 c1 7 1 6 1 7 2 6 2 4 7 3 2 9 4 0 2\n", | |
| " c2 8 2 7 9 4 7 8 2 2 0 9 7 5 8 6 4\n", | |
| " b2 c1 9 3 8 6 2 4 8 5 8 4 1 5 4 6 3 3\n", | |
| " c2 8 9 9 5 6 1 5 7 9 2 9 5 8 1 2 8" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "midx_col = pd.MultiIndex.from_product([['x1', 'x2', 'x3', 'x4'], ['y1', 'y2'],['z1','z2']],names=['clvl1','clvl2','clvl3'])\n", | |
| "midx_row = pd.MultiIndex.from_product([['a1', 'a2', 'a3', 'a4'], ['b1', 'b2'],['c1','c2']],names=['rlvl1','rlvl2','rlvl3'])\n", | |
| "df = pd.DataFrame(np.random.randint(10,size=(16,16)),index=midx_row,columns=midx_col)\n", | |
| "\n", | |
| "display(df)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Single indexing on a MultiIndexed Dataframe" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Indexing the first *l < L* levels (where *L* = `len(MultiIndex.levels)`) returns a `DataFrame` with the first *l* levels of the row index dropped.\n", | |
| "\n", | |
| "If *l == L* a `Series` is returned.\n", | |
| "\n", | |
| "Note that the column index is always kept intact." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>c1</th>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl3 \n", | |
| "c1 2 4 3 7 5 3 6 9 0 5 8 3 6 2 3 5\n", | |
| "c2 3 4 6 6 5 6 3 2 9 8 1 8 7 0 6 0" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "clvl1 clvl2 clvl3\n", | |
| "x1 y1 z1 2\n", | |
| " z2 4\n", | |
| " y2 z1 3\n", | |
| " z2 7\n", | |
| "x2 y1 z1 5\n", | |
| " z2 3\n", | |
| " y2 z1 6\n", | |
| " z2 9\n", | |
| "x3 y1 z1 0\n", | |
| " z2 5\n", | |
| " y2 z1 8\n", | |
| " z2 3\n", | |
| "x4 y1 z1 6\n", | |
| " z2 2\n", | |
| " y2 z1 3\n", | |
| " z2 5\n", | |
| "Name: (a1, b1, c1), dtype: int64" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "display(df.loc['a1','b1'])\n", | |
| "display(df.loc['a1','b1','c1'])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We can also select all indices at a particular level by using a colon `:`. Note that if we use a colon at any index level, the MultiIndex from the original DataFrame is kept intact (i.e. none of the levels are dropped)." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c1 2 4 3 7 5 3 6 9 0 5 8 3 6 2 3 5\n", | |
| " b2 c1 4 0 5 7 0 4 8 5 7 1 9 4 7 6 6 6" | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df.loc['a1',:,'c1']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Selecting arbitrary indices at multiple levels <a id=\"arbitrary_multi-indexing\"></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The previous examples showed how to select rows that match only a single index at each index level (actually we learned that we can also select all indices at a particular level by using colon `:`). But it's also possible to select arbitrary indices at each index level by using indexing of the form\n", | |
| "\n", | |
| "`df.loc[( (rlvl1 indices), (rlvl2 indices), (rlvl3 indices) ), ( (clvl1 indices), (clvl2 indices), (clvl3 indices) )]`\n", | |
| "\n", | |
| "Note that\n", | |
| "\n", | |
| "1. The column index must be explicitly set \n", | |
| "2. The order of index tuples must match the order of index levels\n", | |
| "\n", | |
| "I'll go into more detail on this syntax in the [next](#ambiguities) section." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Here's a few examples" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>0</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>8</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c2 3 4 6 6 5 6 3 2 9 8 1 8 7 0 6 0\n", | |
| " b2 c2 7 5 8 8 4 7 4 4 9 0 3 6 1 8 0 6\n", | |
| "a2 b1 c2 6 4 6 3 9 3 6 0 3 1 2 3 5 9 8 3\n", | |
| " b2 c2 7 4 9 7 3 7 3 8 4 5 3 1 9 4 0 3\n", | |
| "a4 b1 c2 8 2 7 9 4 7 8 2 2 0 9 7 5 8 6 4\n", | |
| " b2 c2 8 9 9 5 6 1 5 7 9 2 9 5 8 1 2 8" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c2 3 4 6 6\n", | |
| " b2 c2 7 5 8 8\n", | |
| "a2 b1 c2 6 4 6 3\n", | |
| " b2 c2 7 4 9 7\n", | |
| "a4 b1 c2 8 2 7 9\n", | |
| " b2 c2 8 9 9 5" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl3 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c2 3 4\n", | |
| " b2 c2 7 5\n", | |
| "a2 b1 c2 6 4\n", | |
| " b2 c2 7 4\n", | |
| "a4 b1 c2 8 2\n", | |
| " b2 c2 8 9" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">x2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>7</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 \n", | |
| "clvl2 y1 y1 \n", | |
| "clvl3 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c2 3 4 5 6\n", | |
| " b2 c2 7 5 4 7\n", | |
| "a2 b1 c2 6 4 9 3\n", | |
| " b2 c2 7 4 3 7\n", | |
| "a4 b1 c2 8 2 4 7\n", | |
| " b2 c2 8 9 6 1" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "display(df.loc[(('a1','a2','a4'), ('b1','b2'), ('c2')), :])\n", | |
| "display(df.loc[(('a1','a2','a4'), ('b1','b2'), ('c2')), 'x1'])\n", | |
| "display(df.loc[(('a1','a2','a4'), ('b1','b2'), ('c2')), ('x1','y1')])\n", | |
| "display(df.loc[(('a1','a2','a4'), ('b1','b2'), ('c2')), (('x1','x2'),('y1'))])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "To select all indices at a particular level, a `slice(None)` can be used in place of a tuple. (`slice(None)` takes the place of `:` here since a colon inside a tuple is illegal python syntax).\n", | |
| "\n", | |
| "Just as in the last section, using a `slice(None)` at any index level will assure that the MultiIndex from the original DataFrame is kept intact." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>2</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>5</td>\n", | |
| " <td>1</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th rowspan=\"2\" valign=\"top\">a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>7</td>\n", | |
| " <td>1</td>\n", | |
| " <td>6</td>\n", | |
| " <td>1</td>\n", | |
| " <td>7</td>\n", | |
| " <td>2</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>0</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>b2</th>\n", | |
| " <th>c1</th>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>8</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>8</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>4</td>\n", | |
| " <td>1</td>\n", | |
| " <td>5</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c1 2 4 3 7 5 3 6 9 0 5 8 3 6 2 3 5\n", | |
| " b2 c1 4 0 5 7 0 4 8 5 7 1 9 4 7 6 6 6\n", | |
| "a2 b1 c1 3 2 4 2 8 5 7 0 4 6 3 7 2 5 1 4\n", | |
| " b2 c1 8 9 0 7 9 8 0 3 7 6 1 8 9 0 3 9\n", | |
| "a4 b1 c1 7 1 6 1 7 2 6 2 4 7 3 2 9 4 0 2\n", | |
| " b2 c1 9 3 8 6 2 4 8 5 8 4 1 5 4 6 3 3" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "display(df.loc[(('a1','a2','a4'), slice(None), ('c1')), :]) # select all indices at row level 2" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Some ambiguous cases <a id=\"ambiguities\"></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Remember how I said in the section [above](#arbitrary_multi-indexing) that for arbitrary multi-indexing you *had* to specify a column index for it to work? I lied :) This actually isn't always necessary. For example the following two are equivalent" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "True" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "result1 = df.loc[('a1','a2','a4'), ('b1','b2'), ('c2')] # incomplete indexing\n", | |
| "result2 = df.loc[(('a1','a2','a4'), ('b1','b2'), ('c2')),:] # explicit column indexing\n", | |
| "np.all(result1 == result2)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The problem with this type of **incomplete indexing** with multi-index dataframes is that the behavior isn't always well defined. Specifically, when the number of index tuples is 1 or 2, pandas has no way of knowing which index tuples belong to the row index and which belong to the column index.\n", | |
| "\n", | |
| "This is actually a python limitation. You see, indexing with 2 tuples *without* specifying a column index is of the form\n", | |
| "\n", | |
| "`df.loc[( (level1 indices), (level2 indices) )]`\n", | |
| "\n", | |
| "But in the context of the `__getitem__` interface, this notation is exactly equivalent to \n", | |
| "\n", | |
| "`df.loc[(level1 indices), (level2 indices)]`\n", | |
| "\n", | |
| "In pandas, this case will always be interpreted as the typical row and column indexing.\n", | |
| "\n", | |
| "Funnily enough, simply appending a comma after the parenthesis will eliminate this ambiguity\n", | |
| "\n", | |
| "`df.loc[( (level1 indices), (level2 indices) ),]` <-- Note the added comma!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In summary, incomplete indexing with 3 or more indexing tuples works" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl1</th>\n", | |
| " <th>rlvl2</th>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>a1</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>a2</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>9</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " <td>3</td>\n", | |
| " <td>1</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>a4</th>\n", | |
| " <th>b1</th>\n", | |
| " <th>c2</th>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>7</td>\n", | |
| " <td>9</td>\n", | |
| " <td>4</td>\n", | |
| " <td>7</td>\n", | |
| " <td>8</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>0</td>\n", | |
| " <td>9</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>6</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl1 rlvl2 rlvl3 \n", | |
| "a1 b1 c2 3 4 6 6 5 6 3 2 9 8 1 8 7 0 6 0\n", | |
| "a2 b1 c2 6 4 6 3 9 3 6 0 3 1 2 3 5 9 8 3\n", | |
| "a4 b1 c2 8 2 7 9 4 7 8 2 2 0 9 7 5 8 6 4" | |
| ] | |
| }, | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df.loc[('a1','a2','a4'), ('b1','b3'), ('c2')]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "But this does not work when using only 2 (or less) indexing tuples" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "KeyError: ('a1', 'a2', 'a4')\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "try:\n", | |
| " df.loc[('a1','a2','a4'), ('b1','b3')]\n", | |
| "except KeyError as e:\n", | |
| " print \"KeyError:\",e.message" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "KeyError: the label [a2] is not in the [columns]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "try:\n", | |
| " df.loc[('a1','a2','a4')] # remember: this is the same as df.loc['a1','a2','a4'] to python\n", | |
| "except KeyError as e:\n", | |
| " print \"KeyError:\",e.message" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Perhaps surprisingly, in cases where you only need to specify a single index at every level of the row index this type of shorthand indexing will always work - even if the length of the index tuple is 2." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <th>clvl1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x1</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x2</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x3</th>\n", | |
| " <th colspan=\"4\" halign=\"left\">x4</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>clvl2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y1</th>\n", | |
| " <th colspan=\"2\" halign=\"left\">y2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>clvl3</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " <th>z1</th>\n", | |
| " <th>z2</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>rlvl3</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>c1</th>\n", | |
| " <td>2</td>\n", | |
| " <td>4</td>\n", | |
| " <td>3</td>\n", | |
| " <td>7</td>\n", | |
| " <td>5</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>9</td>\n", | |
| " <td>0</td>\n", | |
| " <td>5</td>\n", | |
| " <td>8</td>\n", | |
| " <td>3</td>\n", | |
| " <td>6</td>\n", | |
| " <td>2</td>\n", | |
| " <td>3</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>c2</th>\n", | |
| " <td>3</td>\n", | |
| " <td>4</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>5</td>\n", | |
| " <td>6</td>\n", | |
| " <td>3</td>\n", | |
| " <td>2</td>\n", | |
| " <td>9</td>\n", | |
| " <td>8</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8</td>\n", | |
| " <td>7</td>\n", | |
| " <td>0</td>\n", | |
| " <td>6</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "clvl1 x1 x2 x3 x4 \n", | |
| "clvl2 y1 y2 y1 y2 y1 y2 y1 y2 \n", | |
| "clvl3 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2 z1 z2\n", | |
| "rlvl3 \n", | |
| "c1 2 4 3 7 5 3 6 9 0 5 8 3 6 2 3 5\n", | |
| "c2 3 4 6 6 5 6 3 2 9 8 1 8 7 0 6 0" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df.loc['a1','b1']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "This works because pandas tries first to match the second index (`b1` in our example) to the column index and falls back to the row index if it is not found. Clearly this behavior has some consequences if your row and column Index's are not unique, so take care." | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 2", | |
| "language": "python", | |
| "name": "python2" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.6" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment