Skip to content

Instantly share code, notes, and snippets.

@koaning
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koaning/28a91f5ac8be1571059a to your computer and use it in GitHub Desktop.
Save koaning/28a91f5ac8be1571059a to your computer and use it in GitHub Desktop.
Amsterdam Python Meetup: Pandas 101
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas/Jupyter Talk @ Amsterdam Python Meetup\n",
"\n",
"> Author : Vincent D. Warmerdam @ GoDataDriven \n",
"\n",
"This notebook and my talk will discuss:\n",
"\n",
"- how pandas can help you eliminate the bother out of simple data tasks\n",
"- how jupyter notebooks might change the way you write scripts \n",
"- what sugar both these tools have to offer\n",
"\n",
"This notebook (and supplementary references) can be found on my blog: http://koaning.github.io "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Why Notebook? Why Pandas?\n",
"![](http://www.quickmeme.com/img/35/3521d93d07b8a623d83663e3ad79407b5cebeaedc55f21d0be591290330f656c.jpg)\n",
"\n",
"Things you learn when working with data:\n",
" \n",
"- data is domain specific\n",
"- I like to see what steps my colleague took\n",
"- I need things quick and flexible\n",
"- lots of steps are similar\n",
"- I like to apply the DRY principle\n",
"- I prefer typing to mouseclicking\n",
"\n",
"Things that are nice about python:\n",
"\n",
"- flexible language\n",
"- large community\n",
"- performance\n",
"- tends to written quickly\n",
"\n",
"Things that are nice about jupyter notebooks:\n",
"\n",
"- documentation is gratis! \n",
"- support for more than just python \n",
"- sugar for data analysis/quick scripting \n",
"\n",
"\n",
"Excel fails in many areas. Besides the fact that it cannot handle files larger than 1Gb the main problem with excel is... \n",
"\n",
"![](http://serialized.net/ipython_notebook_talk/PresentationImages/disturbing_documentation.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Documentation \n",
"\n",
"Documentation is done via markdown in the actual notebook file. Tends to read better than comments in sublime and it makes it extremely easy to share with collegues. Notice that it also has support for formulas and other languages.\n",
"\n",
"$$ a^2 + b^2 = c^2 $$ \n",
"\n",
"### The use of other languages: "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%javascript \n",
"console.log(\"This is normal logged output\")\n",
"console.log(\"%cDont make me angry. You wont like me when Im angry.\",\"color: green; font-size:35px;font-weight: bold;\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"javascript": [
"console.log(\"This is normal logged output\")\n",
"console.log(\"%cDont make me angry. You wont like me when Im angry.\",\"color: green; font-size:25px;font-weight: bold;\")"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<IPython.core.display.Javascript at 0x108ed44d0>"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%ruby \n",
"puts(1+1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"2\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext rmagic "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The rmagic extension is already loaded. To reload it, use:\n",
" %reload_ext rmagic\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%R \n",
"summary(ChickWeight)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
" weight Time Chick Diet \n",
" Min. : 35.0 Min. : 0.00 13 : 12 1:220 \n",
" 1st Qu.: 63.0 1st Qu.: 4.00 9 : 12 2:120 \n",
" Median :103.0 Median :10.00 20 : 12 3:120 \n",
" Mean :121.8 Mean :10.72 10 : 12 4:118 \n",
" 3rd Qu.:163.8 3rd Qu.:16.00 17 : 12 \n",
" Max. :373.0 Max. :21.00 19 : 12 \n",
" (Other):506 \n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Package Management \n",
"\n",
"You can install things via pip FROM the ipython notebook if you really wanted to. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pip\n",
"\n",
"def install(package):\n",
" pip.main(['install', package])\n",
"\n",
"# install('pandas') "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np \n",
"import pandas as pd \n",
"from ggplot import *"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Notebook Shortcuts \n",
"\n",
"A list of some useful ones:\n",
"\n",
"- ctrl + enter : run cell\n",
"- shift + enter : run cell and create/select the one after\n",
"- ctrl + m : enter command mode \n",
"- ctrl + s :save notebook \n",
"While in command mode the shortcuts work a bit different: \n",
"\n",
"- up/down arrows browser through different cells \n",
"- y : changes cell to a code cell \n",
"- m : changes cell to a markdown cell\n",
"- a : create new cell above \n",
"- b : create new cell below \n",
"- l : toggle line numbers \n",
"- dd : delete cell "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas\n",
"\n",
"![](http://www.quickmeme.com/img/bd/bd8003add79f5d11643d53abc4dc83aeb0c9dbf060a49c0f055cd18ea41909ef.jpg)\n",
"\n",
"Pandas gives you a datastructure called a DataFrame. This is the object that contains the data and methods that you'll use the most. Initially, the DataFrame will look like a dictionary that contains arrays with extra functionality but in real life it is an high performant data wrangler that provides a more flexible API than excel.
![](http://i.imgur.com/WiKLAyL.png)\n
![](http://i.imgur.com/N4PGj6i.png)\n
> Source: https://www.youtube.com/watch?v=qbYYamU42Sw
Let's go and create a simple DataFrame."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# first create three random arrays, the first two numeric, the last one string based\n",
"a = np.random.randn(10)\n",
"b = np.random.randn(10)\n",
"c = [ 'foo' if x > 0.5 else 'bar' for x in np.random.rand(10)]\n",
"d = { 'a' : pd.Series(a), 'b' : pd.Series(b), 'c': pd.Series(c) } "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that difference between ```a``` and ```pd.Series(a)```. Pandas translates arrays into a ```pd.Series``` object. These objects have characteristics that you would expect from an array but it allows for a flexible index. Normal arrays only have numerical indices but this object also allows for dates and strings. This also means that you can use said indices for more flexible selections of data. \n",
"Also note that pandas lists the ```dtype``` of the array, a normal python array will not do this. Pandas keeps track of what datatype is in the array, again to help you make selections. If the types aren't clear to pandas it will refer to it as an ```object``` array. \n",
"\n",
"Let's now use this dictionary to create a DataFrame object. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df = pd.DataFrame(d) \n",
"df"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-0.334025</td>\n",
" <td> 0.337512</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 0.010460</td>\n",
" <td> 1.348823</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.010900</td>\n",
" <td>-0.084181</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-2.023351</td>\n",
" <td>-0.845294</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.673169</td>\n",
" <td>-1.162183</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-1.592835</td>\n",
" <td> 0.216610</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-0.011130</td>\n",
" <td> 2.234762</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> 1.080173</td>\n",
" <td> 0.346137</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-1.741101</td>\n",
" <td> 0.680114</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.029892</td>\n",
" <td>-1.701903</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10 rows \u00d7 3 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
" a b c\n",
"0 -0.334025 0.337512 bar\n",
"1 0.010460 1.348823 foo\n",
"2 -0.010900 -0.084181 foo\n",
"3 -2.023351 -0.845294 foo\n",
"4 -0.673169 -1.162183 bar\n",
"5 -1.592835 0.216610 foo\n",
"6 -0.011130 2.234762 foo\n",
"7 1.080173 0.346137 foo\n",
"8 -1.741101 0.680114 foo\n",
"9 -0.029892 -1.701903 foo\n",
"\n",
"[10 rows x 3 columns]"
]
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This DataFrame object will be the main object you will talk to when using pandas. Note the column names are just like those assigned in the dictionary. Also note that the indices of this data frame at the same indices as the original ```pd.Series``` objects. This object should feel like the traditional excel table. \n",
"\n",
"![](http://www.twoodardfitness.com/wp-content/uploads/2014/04/keep-calm-and-keep-it-simple.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### List of simple queries we can ask to this object. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# select a column from the dataframe, dict-style\n",
"df['a']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 45,
"text": [
"0 -0.334025\n",
"1 0.010460\n",
"2 -0.010900\n",
"3 -2.023351\n",
"4 -0.673169\n",
"5 -1.592835\n",
"6 -0.011130\n",
"7 1.080173\n",
"8 -1.741101\n",
"9 -0.029892\n",
"Name: a, dtype: float64"
]
}
],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# so you can create a boolean list \n",
"df.a < 0"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 32,
"text": [
"0 False\n",
"1 False\n",
"2 True\n",
"3 False\n",
"4 True\n",
"5 True\n",
"6 True\n",
"7 False\n",
"8 True\n",
"9 False\n",
"Name: a, dtype: bool"
]
}
],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# this column behaves just like a numpy array \n",
"df['e'] = 1 + df.a \n",
"df"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" <th>e</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-0.334025</td>\n",
" <td> 0.337512</td>\n",
" <td> bar</td>\n",
" <td> 0.665975</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 0.010460</td>\n",
" <td> 1.348823</td>\n",
" <td> foo</td>\n",
" <td> 1.010460</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.010900</td>\n",
" <td>-0.084181</td>\n",
" <td> foo</td>\n",
" <td> 0.989100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-2.023351</td>\n",
" <td>-0.845294</td>\n",
" <td> foo</td>\n",
" <td>-1.023351</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.673169</td>\n",
" <td>-1.162183</td>\n",
" <td> bar</td>\n",
" <td> 0.326831</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-1.592835</td>\n",
" <td> 0.216610</td>\n",
" <td> foo</td>\n",
" <td>-0.592835</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-0.011130</td>\n",
" <td> 2.234762</td>\n",
" <td> foo</td>\n",
" <td> 0.988870</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> 1.080173</td>\n",
" <td> 0.346137</td>\n",
" <td> foo</td>\n",
" <td> 2.080173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-1.741101</td>\n",
" <td> 0.680114</td>\n",
" <td> foo</td>\n",
" <td>-0.741101</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.029892</td>\n",
" <td>-1.701903</td>\n",
" <td> foo</td>\n",
" <td> 0.970108</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10 rows \u00d7 4 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": [
" a b c e\n",
"0 -0.334025 0.337512 bar 0.665975\n",
"1 0.010460 1.348823 foo 1.010460\n",
"2 -0.010900 -0.084181 foo 0.989100\n",
"3 -2.023351 -0.845294 foo -1.023351\n",
"4 -0.673169 -1.162183 bar 0.326831\n",
"5 -1.592835 0.216610 foo -0.592835\n",
"6 -0.011130 2.234762 foo 0.988870\n",
"7 1.080173 0.346137 foo 2.080173\n",
"8 -1.741101 0.680114 foo -0.741101\n",
"9 -0.029892 -1.701903 foo 0.970108\n",
"\n",
"[10 rows x 4 columns]"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# this true-false list can be used on the dataframe for selection\n",
"df[df.a < 0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>-0.134228</td>\n",
" <td> 0.852610</td>\n",
" <td> foo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-0.522145</td>\n",
" <td> 0.314408</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>-0.273119</td>\n",
" <td> 0.386812</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>-1.045761</td>\n",
" <td> 0.324863</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.838586</td>\n",
" <td>-0.220757</td>\n",
" <td> bar</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
" a b c\n",
"2 -0.134228 0.852610 foo\n",
"3 -0.522145 0.314408 bar\n",
"5 -0.273119 0.386812 bar\n",
"6 -1.045761 0.324863 bar\n",
"9 -0.838586 -0.220757 bar"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# you can combine true false lists\n",
"df[ (df.a < 0) & (df.b < 0) ] "
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" <th>g</th>\n",
" <th>e</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.838586</td>\n",
" <td>-0.220757</td>\n",
" <td> bar</td>\n",
" <td>-1.059343</td>\n",
" <td> 0.161414</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 57,
"text": [
" a b c g e\n",
"9 -0.838586 -0.220757 bar -1.059343 0.161414"
]
}
],
"prompt_number": 57
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# and we could again only get a certain column back \n",
"df[ (df.a < 0) & (df.b > 0) ].g"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 60,
"text": [
"2 0.718382\n",
"3 -0.207737\n",
"5 0.113693\n",
"6 -0.720898\n",
"Name: g, dtype: float64"
]
}
],
"prompt_number": 60
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice for this last query that we don't just get array values back. We also get the original indices from the dataframe."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# we can also ask things directly to the DataFrame \n",
"df.head(1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" <th>g</th>\n",
" <th>e</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 1.342864</td>\n",
" <td>-0.871284</td>\n",
" <td> foo</td>\n",
" <td> 0.471581</td>\n",
" <td> 2.342864</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 62,
"text": [
" a b c g e\n",
"0 1.342864 -0.871284 foo 0.471581 2.342864"
]
}
],
"prompt_number": 62
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# what has a head, usually has a tail\n",
"df.tail(1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>c</th>\n",
" <th>g</th>\n",
" <th>e</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>-0.838586</td>\n",
" <td>-0.220757</td>\n",
" <td> bar</td>\n",
" <td>-1.059343</td>\n",
" <td> 0.161414</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 63,
"text": [
" a b c g e\n",
"9 -0.838586 -0.220757 bar -1.059343 0.161414"
]
}
],
"prompt_number": 63
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note the indices for these two methods."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# if you want to know the number of rows/columns \n",
"df.shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 64,
"text": [
"(10, 5)"
]
}
],
"prompt_number": 64
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# quick summary of data \n",
"df.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>a</th>\n",
" <th>b</th>\n",
" <th>g</th>\n",
" <th>e</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td> 10.000000</td>\n",
" <td> 10.000000</td>\n",
" <td> 10.000000</td>\n",
" <td> 10.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 0.087573</td>\n",
" <td> 0.203792</td>\n",
" <td> 0.291366</td>\n",
" <td> 1.087573</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 0.767731</td>\n",
" <td> 0.499275</td>\n",
" <td> 0.757998</td>\n",
" <td> 0.767731</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> -1.045761</td>\n",
" <td> -0.871284</td>\n",
" <td> -1.059343</td>\n",
" <td> -0.045761</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> -0.459889</td>\n",
" <td> 0.080989</td>\n",
" <td> -0.127380</td>\n",
" <td> 0.540111</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 0.185772</td>\n",
" <td> 0.274838</td>\n",
" <td> 0.536605</td>\n",
" <td> 1.185772</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 0.549000</td>\n",
" <td> 0.371325</td>\n",
" <td> 0.704920</td>\n",
" <td> 1.549000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 1.342864</td>\n",
" <td> 0.852610</td>\n",
" <td> 1.340977</td>\n",
" <td> 2.342864</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 65,
"text": [
" a b g e\n",
"count 10.000000 10.000000 10.000000 10.000000\n",
"mean 0.087573 0.203792 0.291366 1.087573\n",
"std 0.767731 0.499275 0.757998 0.767731\n",
"min -1.045761 -0.871284 -1.059343 -0.045761\n",
"25% -0.459889 0.080989 -0.127380 0.540111\n",
"50% 0.185772 0.274838 0.536605 1.185772\n",
"75% 0.549000 0.371325 0.704920 1.549000\n",
"max 1.342864 0.852610 1.340977 2.342864"
]
}
],
"prompt_number": 65
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# there are some basic functions you can use to aggregate \n",
"# axis = 0 indicates that we applying a function per column\n",
"df.mean(axis=0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 66,
"text": [
"a 0.087573\n",
"b 0.203792\n",
"g 0.291366\n",
"e 1.087573\n",
"dtype: float64"
]
}
],
"prompt_number": 66
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# there are some basic functions you can use to aggregate \n",
"# axis = 1 indicates that we applying a function per row\n",
"df.mean(axis=1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 67,
"text": [
"0 0.821506\n",
"1 1.046932\n",
"2 0.575634\n",
"3 0.015595\n",
"4 0.934312\n",
"5 0.238567\n",
"6 -0.371889\n",
"7 0.683327\n",
"8 0.721095\n",
"9 -0.489318\n",
"dtype: float64"
]
}
],
"prompt_number": 67
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Small Historial Note \n",
"Pandas was written by Wes McKinney, who wrote it while working at a financial institution. Financial data analysis usually involves working a lot with dates. It is no coincidence that pandas has great support for working with time series. We can easily apply functions per week or per month. \n",
"\n",
"The timeseries support is vast. Pandas only requires that the index of a dataframe is a timestamp. It then allows you to perform any function on any grouped part of data. So the index that is supplied doesn't have to be a number, it can also be a timestamp!\n",
"\n",
"# Split-Apply-Combine \n",
"\n",
"A moment of abstraction. \n",
"\n",
"Very often we will want to perform group operations on data. In the financial example we saw that we wanted to perform operations for every week or for every month. In another example we might want to apply methods per geolocation/type of person/per website... etc \n",
"\n",
"Whenever we are doing such an operation, we might look at it as a ```split-apply-combine``` operation, shown visually below:\n",
"\n",
"![](https://camo.githubusercontent.com/60a1e7e95eaef8f9a99f43335368915eafedda3e/687474703a2f2f7777772e686f66726f652e6e65742f737461743537392f736c696465732f73706c69742d6170706c792d636f6d62696e652e706e67)\n",
"\n",
"Pandas has great support for these kinds of operations. Based on the key of a dataframe we will split the data and then apply functions to the grouped data. \n",
"\n",
"# Enter ChickWeight \n",
"\n",
"For this next bit we will use the chickweight dataset. This dataset contains information about different diets for chickens. The goal of the dataset is to find out which diet will get the chickens as fat as possible. \n",
"\n",
"![](http://shebazzle.com/wp-content/uploads/2008/06/chicken-fat.jpg)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"chickdf = pd.read_csv('http://koaning.s3-website-us-west-2.amazonaws.com/data/pydata/chickweight.csv')\n",
"chickdf.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>rownum</th>\n",
" <th>weight</th>\n",
" <th>Time</th>\n",
" <th>Chick</th>\n",
" <th>Diet</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td> 578.000000</td>\n",
" <td> 578.000000</td>\n",
" <td> 578.000000</td>\n",
" <td> 578.000000</td>\n",
" <td> 578.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 289.500000</td>\n",
" <td> 121.818339</td>\n",
" <td> 10.717993</td>\n",
" <td> 25.750865</td>\n",
" <td> 2.235294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 166.998503</td>\n",
" <td> 71.071960</td>\n",
" <td> 6.758400</td>\n",
" <td> 14.568795</td>\n",
" <td> 1.162678</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 1.000000</td>\n",
" <td> 35.000000</td>\n",
" <td> 0.000000</td>\n",
" <td> 1.000000</td>\n",
" <td> 1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 145.250000</td>\n",
" <td> 63.000000</td>\n",
" <td> 4.000000</td>\n",
" <td> 13.000000</td>\n",
" <td> 1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 289.500000</td>\n",
" <td> 103.000000</td>\n",
" <td> 10.000000</td>\n",
" <td> 26.000000</td>\n",
" <td> 2.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 433.750000</td>\n",
" <td> 163.750000</td>\n",
" <td> 16.000000</td>\n",
" <td> 38.000000</td>\n",
" <td> 3.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 578.000000</td>\n",
" <td> 373.000000</td>\n",
" <td> 21.000000</td>\n",
" <td> 50.000000</td>\n",
" <td> 4.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows \u00d7 5 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 72,
"text": [
" rownum weight Time Chick Diet\n",
"count 578.000000 578.000000 578.000000 578.000000 578.000000\n",
"mean 289.500000 121.818339 10.717993 25.750865 2.235294\n",
"std 166.998503 71.071960 6.758400 14.568795 1.162678\n",
"min 1.000000 35.000000 0.000000 1.000000 1.000000\n",
"25% 145.250000 63.000000 4.000000 13.000000 1.000000\n",
"50% 289.500000 103.000000 10.000000 26.000000 2.000000\n",
"75% 433.750000 163.750000 16.000000 38.000000 3.000000\n",
"max 578.000000 373.000000 21.000000 50.000000 4.000000\n",
"\n",
"[8 rows x 5 columns]"
]
}
],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Imagine doing just that operation in excel. \n",
"\n",
"![](http://img.pandawhale.com/post-26343-panda-riding-unicorn-meme-imgu-VjM2.jpeg)\n",
"\n",
"The goal is to find out which diet causes the most weight gain for chickens, so let's group chickens per diet. You do this by creating a grouped object. This groups the dataframe to groups based on column values. This ```grouped``` variable can be iterated over."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"grouped = chickdf.groupby(chickdf.Diet)\n",
"\n",
"for thing in grouped:\n",
" print thing"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(1, weight Time Chick Diet\n",
"rownum \n",
"1 42 0 1 1\n",
"2 51 2 1 1\n",
"3 59 4 1 1\n",
"4 64 6 1 1\n",
"5 76 8 1 1\n",
"6 93 10 1 1\n",
"7 106 12 1 1\n",
"8 125 14 1 1\n",
"9 149 16 1 1\n",
"10 171 18 1 1\n",
"11 199 20 1 1\n",
"12 205 21 1 1\n",
"13 40 0 2 1\n",
"14 49 2 2 1\n",
"15 58 4 2 1\n",
"16 72 6 2 1\n",
"17 84 8 2 1\n",
"18 103 10 2 1\n",
"19 122 12 2 1\n",
"20 138 14 2 1\n",
"21 162 16 2 1\n",
"22 187 18 2 1\n",
"23 209 20 2 1\n",
"24 215 21 2 1\n",
"25 43 0 3 1\n",
"26 39 2 3 1\n",
"27 55 4 3 1\n",
"28 67 6 3 1\n",
"29 84 8 3 1\n",
"30 99 10 3 1\n",
"31 115 12 3 1\n",
"32 138 14 3 1\n",
"33 163 16 3 1\n",
"34 187 18 3 1\n",
"35 198 20 3 1\n",
"36 202 21 3 1\n",
"37 42 0 4 1\n",
"38 49 2 4 1\n",
"39 56 4 4 1\n",
"40 67 6 4 1\n",
"41 74 8 4 1\n",
"42 87 10 4 1\n",
"43 102 12 4 1\n",
"44 108 14 4 1\n",
"45 136 16 4 1\n",
"46 154 18 4 1\n",
"47 160 20 4 1\n",
"48 157 21 4 1\n",
"49 41 0 5 1\n",
"50 42 2 5 1\n",
"51 48 4 5 1\n",
"52 60 6 5 1\n",
"53 79 8 5 1\n",
"54 106 10 5 1\n",
"55 141 12 5 1\n",
"56 164 14 5 1\n",
"57 197 16 5 1\n",
"58 199 18 5 1\n",
"59 220 20 5 1\n",
"60 223 21 5 1\n",
" ... ... ... ...\n",
"\n",
"[220 rows x 4 columns])\n",
"(2, weight Time Chick Diet\n",
"rownum \n",
"221 40 0 21 2\n",
"222 50 2 21 2\n",
"223 62 4 21 2\n",
"224 86 6 21 2\n",
"225 125 8 21 2\n",
"226 163 10 21 2\n",
"227 217 12 21 2\n",
"228 240 14 21 2\n",
"229 275 16 21 2\n",
"230 307 18 21 2\n",
"231 318 20 21 2\n",
"232 331 21 21 2\n",
"233 41 0 22 2\n",
"234 55 2 22 2\n",
"235 64 4 22 2\n",
"236 77 6 22 2\n",
"237 90 8 22 2\n",
"238 95 10 22 2\n",
"239 108 12 22 2\n",
"240 111 14 22 2\n",
"241 131 16 22 2\n",
"242 148 18 22 2\n",
"243 164 20 22 2\n",
"244 167 21 22 2\n",
"245 43 0 23 2\n",
"246 52 2 23 2\n",
"247 61 4 23 2\n",
"248 73 6 23 2\n",
"249 90 8 23 2\n",
"250 103 10 23 2\n",
"251 127 12 23 2\n",
"252 135 14 23 2\n",
"253 145 16 23 2\n",
"254 163 18 23 2\n",
"255 170 20 23 2\n",
"256 175 21 23 2\n",
"257 42 0 24 2\n",
"258 52 2 24 2\n",
"259 58 4 24 2\n",
"260 74 6 24 2\n",
"261 66 8 24 2\n",
"262 68 10 24 2\n",
"263 70 12 24 2\n",
"264 71 14 24 2\n",
"265 72 16 24 2\n",
"266 72 18 24 2\n",
"267 76 20 24 2\n",
"268 74 21 24 2\n",
"269 40 0 25 2\n",
"270 49 2 25 2\n",
"271 62 4 25 2\n",
"272 78 6 25 2\n",
"273 102 8 25 2\n",
"274 124 10 25 2\n",
"275 146 12 25 2\n",
"276 164 14 25 2\n",
"277 197 16 25 2\n",
"278 231 18 25 2\n",
"279 259 20 25 2\n",
"280 265 21 25 2\n",
" ... ... ... ...\n",
"\n",
"[120 rows x 4 columns])\n",
"(3, weight Time Chick Diet\n",
"rownum \n",
"341 42 0 31 3\n",
"342 53 2 31 3\n",
"343 62 4 31 3\n",
"344 73 6 31 3\n",
"345 85 8 31 3\n",
"346 102 10 31 3\n",
"347 123 12 31 3\n",
"348 138 14 31 3\n",
"349 170 16 31 3\n",
"350 204 18 31 3\n",
"351 235 20 31 3\n",
"352 256 21 31 3\n",
"353 41 0 32 3\n",
"354 49 2 32 3\n",
"355 65 4 32 3\n",
"356 82 6 32 3\n",
"357 107 8 32 3\n",
"358 129 10 32 3\n",
"359 159 12 32 3\n",
"360 179 14 32 3\n",
"361 221 16 32 3\n",
"362 263 18 32 3\n",
"363 291 20 32 3\n",
"364 305 21 32 3\n",
"365 39 0 33 3\n",
"366 50 2 33 3\n",
"367 63 4 33 3\n",
"368 77 6 33 3\n",
"369 96 8 33 3\n",
"370 111 10 33 3\n",
"371 137 12 33 3\n",
"372 144 14 33 3\n",
"373 151 16 33 3\n",
"374 146 18 33 3\n",
"375 156 20 33 3\n",
"376 147 21 33 3\n",
"377 41 0 34 3\n",
"378 49 2 34 3\n",
"379 63 4 34 3\n",
"380 85 6 34 3\n",
"381 107 8 34 3\n",
"382 134 10 34 3\n",
"383 164 12 34 3\n",
"384 186 14 34 3\n",
"385 235 16 34 3\n",
"386 294 18 34 3\n",
"387 327 20 34 3\n",
"388 341 21 34 3\n",
"389 41 0 35 3\n",
"390 53 2 35 3\n",
"391 64 4 35 3\n",
"392 87 6 35 3\n",
"393 123 8 35 3\n",
"394 158 10 35 3\n",
"395 201 12 35 3\n",
"396 238 14 35 3\n",
"397 287 16 35 3\n",
"398 332 18 35 3\n",
"399 361 20 35 3\n",
"400 373 21 35 3\n",
" ... ... ... ...\n",
"\n",
"[120 rows x 4 columns])\n",
"(4, weight Time Chick Diet\n",
"rownum \n",
"461 42 0 41 4\n",
"462 51 2 41 4\n",
"463 66 4 41 4\n",
"464 85 6 41 4\n",
"465 103 8 41 4\n",
"466 124 10 41 4\n",
"467 155 12 41 4\n",
"468 153 14 41 4\n",
"469 175 16 41 4\n",
"470 184 18 41 4\n",
"471 199 20 41 4\n",
"472 204 21 41 4\n",
"473 42 0 42 4\n",
"474 49 2 42 4\n",
"475 63 4 42 4\n",
"476 84 6 42 4\n",
"477 103 8 42 4\n",
"478 126 10 42 4\n",
"479 160 12 42 4\n",
"480 174 14 42 4\n",
"481 204 16 42 4\n",
"482 234 18 42 4\n",
"483 269 20 42 4\n",
"484 281 21 42 4\n",
"485 42 0 43 4\n",
"486 55 2 43 4\n",
"487 69 4 43 4\n",
"488 96 6 43 4\n",
"489 131 8 43 4\n",
"490 157 10 43 4\n",
"491 184 12 43 4\n",
"492 188 14 43 4\n",
"493 197 16 43 4\n",
"494 198 18 43 4\n",
"495 199 20 43 4\n",
"496 200 21 43 4\n",
"497 42 0 44 4\n",
"498 51 2 44 4\n",
"499 65 4 44 4\n",
"500 86 6 44 4\n",
"501 103 8 44 4\n",
"502 118 10 44 4\n",
"503 127 12 44 4\n",
"504 138 14 44 4\n",
"505 145 16 44 4\n",
"506 146 18 44 4\n",
"507 41 0 45 4\n",
"508 50 2 45 4\n",
"509 61 4 45 4\n",
"510 78 6 45 4\n",
"511 98 8 45 4\n",
"512 117 10 45 4\n",
"513 135 12 45 4\n",
"514 141 14 45 4\n",
"515 147 16 45 4\n",
"516 174 18 45 4\n",
"517 197 20 45 4\n",
"518 196 21 45 4\n",
"519 40 0 46 4\n",
"520 52 2 46 4\n",
" ... ... ... ...\n",
"\n",
"[118 rows x 4 columns])\n"
]
}
],
"prompt_number": 70
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Each group still behaves like a dataframe, so we can also apply the describe function here. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"grouped.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>Chick</th>\n",
" <th>Time</th>\n",
" <th>weight</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Diet</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">1</th>\n",
" <th>count</th>\n",
" <td> 220.000000</td>\n",
" <td> 220.000000</td>\n",
" <td> 220.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 9.963636</td>\n",
" <td> 10.481818</td>\n",
" <td> 102.645455</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 5.700160</td>\n",
" <td> 6.754984</td>\n",
" <td> 56.656553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 1.000000</td>\n",
" <td> 0.000000</td>\n",
" <td> 35.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 5.000000</td>\n",
" <td> 4.000000</td>\n",
" <td> 57.750000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 10.000000</td>\n",
" <td> 10.000000</td>\n",
" <td> 88.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 14.000000</td>\n",
" <td> 16.000000</td>\n",
" <td> 136.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 20.000000</td>\n",
" <td> 21.000000</td>\n",
" <td> 305.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">2</th>\n",
" <th>count</th>\n",
" <td> 120.000000</td>\n",
" <td> 120.000000</td>\n",
" <td> 120.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 25.500000</td>\n",
" <td> 10.916667</td>\n",
" <td> 122.616667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 2.884324</td>\n",
" <td> 6.804081</td>\n",
" <td> 71.607495</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 21.000000</td>\n",
" <td> 0.000000</td>\n",
" <td> 39.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 23.000000</td>\n",
" <td> 5.500000</td>\n",
" <td> 65.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 25.500000</td>\n",
" <td> 11.000000</td>\n",
" <td> 104.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 28.000000</td>\n",
" <td> 16.500000</td>\n",
" <td> 163.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 30.000000</td>\n",
" <td> 21.000000</td>\n",
" <td> 331.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">3</th>\n",
" <th>count</th>\n",
" <td> 120.000000</td>\n",
" <td> 120.000000</td>\n",
" <td> 120.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 35.500000</td>\n",
" <td> 10.916667</td>\n",
" <td> 142.950000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 2.884324</td>\n",
" <td> 6.804081</td>\n",
" <td> 86.541761</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 31.000000</td>\n",
" <td> 0.000000</td>\n",
" <td> 39.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 33.000000</td>\n",
" <td> 5.500000</td>\n",
" <td> 67.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 35.500000</td>\n",
" <td> 11.000000</td>\n",
" <td> 125.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 38.000000</td>\n",
" <td> 16.500000</td>\n",
" <td> 198.750000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 40.000000</td>\n",
" <td> 21.000000</td>\n",
" <td> 373.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">4</th>\n",
" <th>count</th>\n",
" <td> 118.000000</td>\n",
" <td> 118.000000</td>\n",
" <td> 118.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 45.525424</td>\n",
" <td> 10.754237</td>\n",
" <td> 135.262712</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 2.902141</td>\n",
" <td> 6.744338</td>\n",
" <td> 68.828714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 41.000000</td>\n",
" <td> 0.000000</td>\n",
" <td> 39.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 43.000000</td>\n",
" <td> 4.500000</td>\n",
" <td> 71.250000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 46.000000</td>\n",
" <td> 10.000000</td>\n",
" <td> 129.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 48.000000</td>\n",
" <td> 16.000000</td>\n",
" <td> 184.750000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 50.000000</td>\n",
" <td> 21.000000</td>\n",
" <td> 322.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": [
" Chick Time weight\n",
"Diet \n",
"1 count 220.000000 220.000000 220.000000\n",
" mean 9.963636 10.481818 102.645455\n",
" std 5.700160 6.754984 56.656553\n",
" min 1.000000 0.000000 35.000000\n",
" 25% 5.000000 4.000000 57.750000\n",
" 50% 10.000000 10.000000 88.000000\n",
" 75% 14.000000 16.000000 136.500000\n",
" max 20.000000 21.000000 305.000000\n",
"2 count 120.000000 120.000000 120.000000\n",
" mean 25.500000 10.916667 122.616667\n",
" std 2.884324 6.804081 71.607495\n",
" min 21.000000 0.000000 39.000000\n",
" 25% 23.000000 5.500000 65.500000\n",
" 50% 25.500000 11.000000 104.500000\n",
" 75% 28.000000 16.500000 163.000000\n",
" max 30.000000 21.000000 331.000000\n",
"3 count 120.000000 120.000000 120.000000\n",
" mean 35.500000 10.916667 142.950000\n",
" std 2.884324 6.804081 86.541761\n",
" min 31.000000 0.000000 39.000000\n",
" 25% 33.000000 5.500000 67.500000\n",
" 50% 35.500000 11.000000 125.500000\n",
" 75% 38.000000 16.500000 198.750000\n",
" max 40.000000 21.000000 373.000000\n",
"4 count 118.000000 118.000000 118.000000\n",
" mean 45.525424 10.754237 135.262712\n",
" std 2.902141 6.744338 68.828714\n",
" min 41.000000 0.000000 39.000000\n",
" 25% 43.000000 4.500000 71.250000\n",
" 50% 46.000000 10.000000 129.500000\n",
" 75% 48.000000 16.000000 184.750000\n",
" max 50.000000 21.000000 322.000000"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Applying your own\n",
"We can use built in functions on our grouped objects, but we can also just apply our own functions. Note that these functions need to be able to be applied to a DataFrame object. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def show_size(x):\n",
" return \"Dude we have \" + str(len(x)) + \" chickens here!\" \n",
"\n",
"grouped.apply(show_size)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 71,
"text": [
"Diet\n",
"1 Dude we have 220 chickens here!\n",
"2 Dude we have 120 chickens here!\n",
"3 Dude we have 120 chickens here!\n",
"4 Dude we have 118 chickens here!\n",
"dtype: object"
]
}
],
"prompt_number": 71
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Realize that this means that **any** function can be used here. You will want to think about performance when dealing with large datasets. This functionality is one of the things that make the pandas API very powerful. \n",
"\n",
"![](http://sd.keepcalm-o-matic.co.uk/i/keep-calm-cause-i-m-a-panda-and-i-m-awesome.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Advanced Groups \n",
"We can also created groups based on two columns in the table. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"chickdf.groupby(['Diet','Time']).weight.apply(show_size)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 72,
"text": [
"Diet Time\n",
"1 0 Dude we have 20 chickens here!\n",
" 2 Dude we have 20 chickens here!\n",
" 4 Dude we have 19 chickens here!\n",
" 6 Dude we have 19 chickens here!\n",
" 8 Dude we have 19 chickens here!\n",
" 10 Dude we have 19 chickens here!\n",
" 12 Dude we have 19 chickens here!\n",
" 14 Dude we have 18 chickens here!\n",
" 16 Dude we have 17 chickens here!\n",
" 18 Dude we have 17 chickens here!\n",
" 20 Dude we have 17 chickens here!\n",
" 21 Dude we have 16 chickens here!\n",
"2 0 Dude we have 10 chickens here!\n",
" 2 Dude we have 10 chickens here!\n",
" 4 Dude we have 10 chickens here!\n",
" 6 Dude we have 10 chickens here!\n",
" 8 Dude we have 10 chickens here!\n",
" 10 Dude we have 10 chickens here!\n",
" 12 Dude we have 10 chickens here!\n",
" 14 Dude we have 10 chickens here!\n",
" 16 Dude we have 10 chickens here!\n",
" 18 Dude we have 10 chickens here!\n",
" 20 Dude we have 10 chickens here!\n",
" 21 Dude we have 10 chickens here!\n",
"3 0 Dude we have 10 chickens here!\n",
" 2 Dude we have 10 chickens here!\n",
" 4 Dude we have 10 chickens here!\n",
" 6 Dude we have 10 chickens here!\n",
" 8 Dude we have 10 chickens here!\n",
" 10 Dude we have 10 chickens here!\n",
" 12 Dude we have 10 chickens here!\n",
" 14 Dude we have 10 chickens here!\n",
" 16 Dude we have 10 chickens here!\n",
" 18 Dude we have 10 chickens here!\n",
" 20 Dude we have 10 chickens here!\n",
" 21 Dude we have 10 chickens here!\n",
"4 0 Dude we have 10 chickens here!\n",
" 2 Dude we have 10 chickens here!\n",
" 4 Dude we have 10 chickens here!\n",
" 6 Dude we have 10 chickens here!\n",
" 8 Dude we have 10 chickens here!\n",
" 10 Dude we have 10 chickens here!\n",
" 12 Dude we have 10 chickens here!\n",
" 14 Dude we have 10 chickens here!\n",
" 16 Dude we have 10 chickens here!\n",
" 18 Dude we have 10 chickens here!\n",
" 20 Dude we have 9 chickens here!\n",
" 21 Dude we have 9 chickens here!\n",
"Name: weight, dtype: object"
]
}
],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](http://i.imgur.com/XwKGpTw.jpg)\n",
"\n",
"# Visualisation \n",
"\n",
"You can also combine pandas with plotting tools like **ggplot** for fast interactive data exploration."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline\n",
"\n",
"ggplot(aes(x='Time', y='weight'), data=chickdf) + geom_point() "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x113ef6a50>"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 76,
"text": [
"<ggplot: (287054765)>"
]
}
],
"prompt_number": 76
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"agg = chickdf.groupby(['Diet','Time']).weight.aggregate(mean)\n",
"agg = agg.reset_index()\n",
"agg"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Diet</th>\n",
" <th>Time</th>\n",
" <th>weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0 </th>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 41.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1 </th>\n",
" <td> 1</td>\n",
" <td> 2</td>\n",
" <td> 47.250000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2 </th>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 56.473684</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3 </th>\n",
" <td> 1</td>\n",
" <td> 6</td>\n",
" <td> 66.789474</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4 </th>\n",
" <td> 1</td>\n",
" <td> 8</td>\n",
" <td> 79.684211</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5 </th>\n",
" <td> 1</td>\n",
" <td> 10</td>\n",
" <td> 93.052632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6 </th>\n",
" <td> 1</td>\n",
" <td> 12</td>\n",
" <td> 108.526316</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7 </th>\n",
" <td> 1</td>\n",
" <td> 14</td>\n",
" <td> 123.388889</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8 </th>\n",
" <td> 1</td>\n",
" <td> 16</td>\n",
" <td> 144.647059</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9 </th>\n",
" <td> 1</td>\n",
" <td> 18</td>\n",
" <td> 158.941176</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td> 1</td>\n",
" <td> 20</td>\n",
" <td> 170.411765</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td> 1</td>\n",
" <td> 21</td>\n",
" <td> 177.750000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td> 2</td>\n",
" <td> 0</td>\n",
" <td> 40.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td> 2</td>\n",
" <td> 2</td>\n",
" <td> 49.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td> 2</td>\n",
" <td> 4</td>\n",
" <td> 59.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td> 2</td>\n",
" <td> 6</td>\n",
" <td> 75.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td> 2</td>\n",
" <td> 8</td>\n",
" <td> 91.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td> 2</td>\n",
" <td> 10</td>\n",
" <td> 108.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td> 2</td>\n",
" <td> 12</td>\n",
" <td> 131.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td> 2</td>\n",
" <td> 14</td>\n",
" <td> 141.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td> 2</td>\n",
" <td> 16</td>\n",
" <td> 164.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td> 2</td>\n",
" <td> 18</td>\n",
" <td> 187.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td> 2</td>\n",
" <td> 20</td>\n",
" <td> 205.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td> 2</td>\n",
" <td> 21</td>\n",
" <td> 214.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td> 3</td>\n",
" <td> 0</td>\n",
" <td> 40.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td> 3</td>\n",
" <td> 2</td>\n",
" <td> 50.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td> 3</td>\n",
" <td> 4</td>\n",
" <td> 62.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td> 3</td>\n",
" <td> 6</td>\n",
" <td> 77.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td> 3</td>\n",
" <td> 8</td>\n",
" <td> 98.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td> 3</td>\n",
" <td> 10</td>\n",
" <td> 117.100000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td> 3</td>\n",
" <td> 12</td>\n",
" <td> 144.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td> 3</td>\n",
" <td> 14</td>\n",
" <td> 164.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td> 3</td>\n",
" <td> 16</td>\n",
" <td> 197.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td> 3</td>\n",
" <td> 18</td>\n",
" <td> 233.100000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td> 3</td>\n",
" <td> 20</td>\n",
" <td> 258.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td> 3</td>\n",
" <td> 21</td>\n",
" <td> 270.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td> 4</td>\n",
" <td> 0</td>\n",
" <td> 41.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" <td> 51.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" <td> 64.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td> 4</td>\n",
" <td> 6</td>\n",
" <td> 83.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td> 4</td>\n",
" <td> 8</td>\n",
" <td> 105.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td> 4</td>\n",
" <td> 10</td>\n",
" <td> 126.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td> 4</td>\n",
" <td> 12</td>\n",
" <td> 151.400000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td> 4</td>\n",
" <td> 14</td>\n",
" <td> 161.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td> 4</td>\n",
" <td> 16</td>\n",
" <td> 182.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td> 4</td>\n",
" <td> 18</td>\n",
" <td> 202.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td> 4</td>\n",
" <td> 20</td>\n",
" <td> 233.888889</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td> 4</td>\n",
" <td> 21</td>\n",
" <td> 238.555556</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>48 rows \u00d7 3 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 102,
"text": [
" Diet Time weight\n",
"0 1 0 41.400000\n",
"1 1 2 47.250000\n",
"2 1 4 56.473684\n",
"3 1 6 66.789474\n",
"4 1 8 79.684211\n",
"5 1 10 93.052632\n",
"6 1 12 108.526316\n",
"7 1 14 123.388889\n",
"8 1 16 144.647059\n",
"9 1 18 158.941176\n",
"10 1 20 170.411765\n",
"11 1 21 177.750000\n",
"12 2 0 40.700000\n",
"13 2 2 49.400000\n",
"14 2 4 59.800000\n",
"15 2 6 75.400000\n",
"16 2 8 91.700000\n",
"17 2 10 108.500000\n",
"18 2 12 131.300000\n",
"19 2 14 141.900000\n",
"20 2 16 164.700000\n",
"21 2 18 187.700000\n",
"22 2 20 205.600000\n",
"23 2 21 214.700000\n",
"24 3 0 40.800000\n",
"25 3 2 50.400000\n",
"26 3 4 62.200000\n",
"27 3 6 77.900000\n",
"28 3 8 98.400000\n",
"29 3 10 117.100000\n",
"30 3 12 144.400000\n",
"31 3 14 164.500000\n",
"32 3 16 197.400000\n",
"33 3 18 233.100000\n",
"34 3 20 258.900000\n",
"35 3 21 270.300000\n",
"36 4 0 41.000000\n",
"37 4 2 51.800000\n",
"38 4 4 64.500000\n",
"39 4 6 83.900000\n",
"40 4 8 105.600000\n",
"41 4 10 126.000000\n",
"42 4 12 151.400000\n",
"43 4 14 161.800000\n",
"44 4 16 182.000000\n",
"45 4 18 202.900000\n",
"46 4 20 233.888889\n",
"47 4 21 238.555556\n",
"\n",
"[48 rows x 3 columns]"
]
}
],
"prompt_number": 102
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](http://i.imgur.com/BrSrdB6.png)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ggplot(aes(x='Time', y='weight', color=\"Diet\"), data=agg) + geom_line() "
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nkg0bNui66ERnGgfI7prIy1U85+Ovu806jnOq26zkhu4Udr5hw4Z9KRRu27aNKVOmAK2/NLdu3ZqL\n0i44pxsL0HXR2YqKiigtLQXAdV369etHfX29rotOdqZxgOyuiS47g3KmbrPS+SzL4qmnnsK2bcrL\nyykvL891SReshoYGioqKACgsLKShoSHHFV3YPvroIyoqKhg0aBDXXXedbit0opMnT3L48GEGDx6s\n6yKHPh+HsrIy9u/fn9U10WUDiuSP733vexQXF9PY2MjTTz9N3759z7rySjqHZVlYlpXrMi5YM2bM\n4MorrwTgnXfe4fXXX+eWW27JcVUXBt/3ee6557jhhhu+tGpE10Xn8X2fP/zhD9xwww24rpv1NdFl\nb/GcqdusdL7Pu/sWFhYybtw4qqqqclzRhauoqOjUvw7r6+spLCzMcUUXrsLCwlO/DKdPn67ropNE\nUcRzzz3HlClTGDduHKDrIhc+H4fJkyefGodsr4kuG1DUbTY/BEFAJpMBWtPyrl27GDBgQI6runCN\nHTuWDRs2AFBRUXHqB4N0vr/eef2TTz7RddEJjDG8+OKL9OvXj0svvfTU13VddK4zjUO210SX7oOy\nY8cOXnvttVPdZufOnZvrki44NTU1PPfcc0DryqpJkyZpHDrJ888/z759+2hqaqKwsJD58+czbtw4\nLafMgdONxd69ezly5AgAvXr14qabbjr1HIR0jP379/Nf//VfX/jFt2DBAgYPHqzrohOdbhyuvvpq\nKisrs7omunRAERERke6py97iERERke5LAUVERETyjgKKiIiI5B0FFBEREck7CigikhMTJ05kxYoV\nuS5DRPKUOsmKSIcoKio61bGzsbERz/NwHAeAf//3f6eysjKX5YlIntMyYxHpcCNGjOA3v/kNV111\nVa5LEZEuQrd4RCQnhg8fzrJlywD45S9/yR133MG9995LSUkJkydPZseOHfzTP/0TAwYMYNiwYbz5\n5pun3ltbW8vf/d3fMWjQIMrKyvjFL35BHMe5OhUR6QAKKCKSE3+7YdvLL7/MwoULqampYdq0aVxz\nzTUAHDp0iF/84hd8//vfP/XaRYsW4bouu3btYv369bzxxhv8+te/7tT6RaRjKaCISF644ooruOaa\na3Ach29+85ucOHGCn//85ziOw1133cXevXupq6vj6NGjvPrqq/zLv/wL6XSafv368eijj/Lss8/m\n+hREpB3pIVkRyQv9+/c/9d/pdJq+ffuemmVJp9MANDQ0cPDgQYIgYODAgadeH8cxQ4cO7dyCRaRD\nKaCISJcyZMgQUqkUJ06cwLY1CSzSXenqFpEuZeDAgVx77bU8/vjj1NfXE8cxu3btUk8VkW5GAUVE\ncs6yrC89NHu2Pz/11FP4vs/48ePp3bs3d9xxx6lt3EWke1AfFBEREck7mkERERGRvKOAIiIiInlH\nAUVERETyjgKKiIiI5B0FFBEREck7CigiIiKSd/4PVWiNmdv8F1EAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x110579a50>"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 109,
"text": [
"<ggplot: (288808145)>"
]
}
],
"prompt_number": 109
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But in all seriousness, you might want to start thinking about the ethics used in data. \n",
"\n",
"### More Resources \n",
"\n",
"- (my blog) http://koaning.github.io\n",
"- http://jupyter.org/\n",
"- http://pandas.pydata.org/\n",
"- http://ggplot.yhathq.com/"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment