{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "[A while back I claimed](http://www.gregreda.com/2013/01/23/translating-sql-to-pandas-part1/) I was going to write a couple of posts on translating [pandas](http://pandas.pydata.org) to SQL. I never followed up. However, the other week a couple of coworkers expressed their interest in learning a bit more about it - this seemed like a good reason to revisit the topic.\n", "\n", "What follows is a fairly thorough introduction to the library. I chose to break it into three parts as I felt it was too long and daunting as one.\n", "\n", "- [Part 1: Intro to pandas data structures](http://www.gregreda.com/2013/10/26/intro-to-pandas-data-structures/), covers the basics of the library's two main data structures - Series and DataFrames.\n", "\n", "- [Part 2: Working with DataFrames](http://www.gregreda.com/2013/10/26/working-with-pandas-dataframes/), dives a bit deeper into the functionality of DataFrames. It shows how to inspect, select, filter, merge, combine, and group your data.\n", "\n", "- [Part 3: Using pandas with the MovieLens dataset](http://www.gregreda.com/2013/10/26/using-pandas-on-the-movielens-dataset/), applies the learnings of the first two parts in order to answer a few basic analysis questions about the MovieLens ratings data.\n", "\n", "If you'd like to follow along, you can find the necessary CSV files [here](https://github.com/gjreda/gregreda.com/tree/master/content/notebooks/data) and the MovieLens dataset [here](http://files.grouplens.org/datasets/movielens/ml-100k.zip).\n", "\n", "My goal for this tutorial is to teach the basics of pandas by comparing and contrasting its syntax with SQL. Since all of my coworkers are familiar with SQL, I feel this is the best way to provide a context that can be easily understood by the intended audience.\n", "\n", "If you're interested in learning more about the library, pandas author [Wes McKinney](https://twitter.com/wesmckinn) has written [Python for Data Analysis](http://www.amazon.com/gp/product/1449319793/ref=as_li_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=1449319793&linkCode=as2&tag=gjreda-20&linkId=MCGW4C4NOBRVV5OC), which covers it in much greater detail." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### What is it?\n", "[pandas](http://pandas.pydata.org/) is an open source [Python](http://www.python.org/) library for data analysis. Python has always been great for prepping and munging data, but it's never been great for analysis - you'd usually end up using [R](http://www.r-project.org/) or loading it into a database and using SQL (or worse, Excel). pandas makes Python great for analysis." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Data Structures\n", "pandas introduces two new data structures to Python - [Series](http://pandas.pydata.org/pandas-docs/dev/dsintro.html#series) and [DataFrame](http://pandas.pydata.org/pandas-docs/dev/dsintro.html#dataframe), both of which are built on top of [NumPy](http://www.numpy.org/) (this means it's fast)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "pd.set_option('max_columns', 50)\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Series" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A Series is a one-dimensional object similar to an array, list, or column in a table. It will assign a labeled index to each item in the Series. By default, each item will receive an index label from 0 to N, where N is the length of the Series minus one." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "0 7\n", "1 Heisenberg\n", "2 3.14\n", "3 -1789710578\n", "4 Happy Eating!\n", "dtype: object" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a Series with an arbitrary list\n", "s = pd.Series([7, 'Heisenberg', 3.14, -1789710578, 'Happy Eating!'])\n", "s" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Alternatively, you can specify an index to use when creating the Series." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "A 7\n", "Z Heisenberg\n", "C 3.14\n", "Y -1789710578\n", "E Happy Eating!\n", "dtype: object" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([7, 'Heisenberg', 3.14, -1789710578, 'Happy Eating!'],\n", " index=['A', 'Z', 'C', 'Y', 'E'])\n", "s" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The Series constructor can convert a dictonary as well, using the keys of the dictionary as its index." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Austin 450\n", "Boston NaN\n", "Chicago 1000\n", "New York 1300\n", "Portland 900\n", "San Francisco 1100\n", "dtype: float64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = {'Chicago': 1000, 'New York': 1300, 'Portland': 900, 'San Francisco': 1100,\n", " 'Austin': 450, 'Boston': None}\n", "cities = pd.Series(d)\n", "cities" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You can use the index to select specific items from the Series ..." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "1000.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cities['Chicago']" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Chicago 1000\n", "Portland 900\n", "San Francisco 1100\n", "dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cities[['Chicago', 'Portland', 'San Francisco']]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Or you can use boolean indexing for selection." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Austin 450\n", "Portland 900\n", "dtype: float64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cities[cities < 1000]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "That last one might be a little weird, so let's make it more clear - `cities < 1000` returns a Series of True/False values, which we then pass to our Series `cities`, returning the corresponding True items." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Austin True\n", "Boston False\n", "Chicago False\n", "New York False\n", "Portland True\n", "San Francisco False\n", "dtype: bool\n", "\n", "\n", "Austin 450\n", "Portland 900\n", "dtype: float64\n" ] } ], "source": [ "less_than_1000 = cities < 1000\n", "print(less_than_1000)\n", "print('\\n')\n", "print(cities[less_than_1000])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You can also change the values in a Series on the fly." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Old value:', 1000.0)\n", "('New value:', 1400.0)\n" ] } ], "source": [ "# changing based on the index\n", "print('Old value:', cities['Chicago'])\n", "cities['Chicago'] = 1400\n", "print('New value:', cities['Chicago'])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Austin 450\n", "Portland 900\n", "dtype: float64\n", "\n", "\n", "Austin 750\n", "Portland 750\n", "dtype: float64\n" ] } ], "source": [ "# changing values using boolean logic\n", "print(cities[cities < 1000])\n", "print('\\n')\n", "cities[cities < 1000] = 750\n", "\n", "print(cities[cities < 1000])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "What if you aren't sure whether an item is in the Series? You can check using idiomatic Python." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", "True\n" ] } ], "source": [ "print('Seattle' in cities)\n", "print('San Francisco' in cities)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Mathematical operations can be done using scalars and functions." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Austin 250.000000\n", "Boston NaN\n", "Chicago 466.666667\n", "New York 433.333333\n", "Portland 250.000000\n", "San Francisco 366.666667\n", "dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# divide city values by 3\n", "cities / 3" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Austin 562500\n", "Boston NaN\n", "Chicago 1960000\n", "New York 1690000\n", "Portland 562500\n", "San Francisco 1210000\n", "dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# square city values\n", "np.square(cities)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You can add two Series together, which returns a union of the two Series with the addition occurring on the shared index values. Values on either Series that did not have a shared index will produce a NULL/NaN (not a number)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chicago 1400\n", "New York 1300\n", "Portland 750\n", "dtype: float64\n", "\n", "\n", "Austin 750\n", "New York 1300\n", "dtype: float64\n", "\n", "\n", "Austin NaN\n", "Chicago NaN\n", "New York 2600\n", "Portland NaN\n", "dtype: float64\n" ] } ], "source": [ "print(cities[['Chicago', 'New York', 'Portland']])\n", "print('\\n')\n", "print(cities[['Austin', 'New York']])\n", "print('\\n')\n", "print(cities[['Chicago', 'New York', 'Portland']] + cities[['Austin', 'New York']])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Notice that because Austin, Chicago, and Portland were not found in both Series, they were returned with NULL/NaN values.\n", "\n", "NULL checking can be performed with `isnull` and `notnull`." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Austin True\n", "Boston False\n", "Chicago True\n", "New York True\n", "Portland True\n", "San Francisco True\n", "dtype: bool" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# returns a boolean series indicating which values aren't NULL\n", "cities.notnull()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Austin False\n", "Boston True\n", "Chicago False\n", "New York False\n", "Portland False\n", "San Francisco False\n", "dtype: bool\n", "\n", "\n", "Boston NaN\n", "dtype: float64\n" ] } ], "source": [ "# use boolean logic to grab the NULL cities\n", "print(cities.isnull())\n", "print('\\n')\n", "print(cities[cities.isnull()])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## DataFrame\n", "\n", "A DataFrame is a tablular data structure comprised of rows and columns, akin to a spreadsheet, database table, or R's data.frame object. You can also think of a DataFrame as a group of Series objects that share an index (the column names).\n", "\n", "For the rest of the tutorial, we'll be primarily working with DataFrames." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Reading Data\n", "\n", "To create a DataFrame out of common Python data structures, we can pass a dictionary of lists to the DataFrame constructor.\n", "\n", "Using the `columns` parameter allows us to tell the constructor how we'd like the columns ordered. By default, the DataFrame constructor will order the columns alphabetically (though this isn't the case when reading from a file - more on that next)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yearteamwinslosses
02010Bears115
12011Bears88
22012Bears106
32011Packers151
42012Packers115
52010Lions610
62011Lions106
72012Lions412
\n", "
" ], "text/plain": [ " year team wins losses\n", "0 2010 Bears 11 5\n", "1 2011 Bears 8 8\n", "2 2012 Bears 10 6\n", "3 2011 Packers 15 1\n", "4 2012 Packers 11 5\n", "5 2010 Lions 6 10\n", "6 2011 Lions 10 6\n", "7 2012 Lions 4 12" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = {'year': [2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012],\n", " 'team': ['Bears', 'Bears', 'Bears', 'Packers', 'Packers', 'Lions', 'Lions', 'Lions'],\n", " 'wins': [11, 8, 10, 15, 11, 6, 10, 4],\n", " 'losses': [5, 8, 6, 1, 5, 10, 6, 12]}\n", "football = pd.DataFrame(data, columns=['year', 'team', 'wins', 'losses'])\n", "football" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Much more often, you'll have a dataset you want to read into a DataFrame. Let's go through several common ways of doing so." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**CSV**\n", "\n", "Reading a CSV is as simple as calling the *read_csv* function. By default, the *read_csv* function expects the column separator to be a comma, but you can change that using the `sep` parameter." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/Users/gjreda/Dropbox (Personal)/tutorials/pandas\n" ] } ], "source": [ "%cd ~/Dropbox/tutorials/pandas/" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Year,Age,Tm,Lg,W,L,W-L%,ERA,G,GS,GF,CG,SHO,SV,IP,H,R,ER,HR,BB,IBB,SO,HBP,BK,WP,BF,ERA+,WHIP,H/9,HR/9,BB/9,SO/9,SO/BB,Awards\r\n", "1995,25,NYY,AL,5,3,.625,5.51,19,10,2,0,0,0,67.0,71,43,41,11,30,0,51,2,1,0,301,84,1.507,9.5,1.5,4.0,6.9,1.70,\r\n", "1996,26,NYY,AL,8,3,.727,2.09,61,0,14,0,0,5,107.2,73,25,25,1,34,3,130,2,0,1,425,240,0.994,6.1,0.1,2.8,10.9,3.82,CYA-3MVP-12\r\n", "1997,27,NYY,AL,6,4,.600,1.88,66,0,56,0,0,43,71.2,65,17,15,5,20,6,68,0,0,2,301,239,1.186,8.2,0.6,2.5,8.5,3.40,ASMVP-25\r\n", "1998,28,NYY,AL,3,0,1.000,1.91,54,0,49,0,0,36,61.1,48,13,13,3,17,1,36,1,0,0,246,233,1.060,7.0,0.4,2.5,5.3,2.12,\r\n" ] } ], "source": [ "# Source: baseball-reference.com/players/r/riverma01.shtml\n", "!head -n 5 mariano-rivera.csv" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
YearAgeTmLgWLW-L%ERAGGSGFCGSHOSVIPHRERHRBBIBBSOHBPBKWPBFERA+WHIPH/9HR/9BB/9SO/9SO/BBAwards
0199525NYYAL530.6255.511910200067.07143411130051210301841.5079.51.54.06.91.70NaN
1199626NYYAL830.7272.0961014005107.273252513431302014252400.9946.10.12.810.93.82CYA-3MVP-12
2199727NYYAL640.6001.8866056004371.26517155206680023012391.1868.20.62.58.53.40ASMVP-25
3199828NYYAL301.0001.9154049003661.14813133171361002462331.0607.00.42.55.32.12NaN
4199929NYYAL430.5711.8366063004569.04315142183523122682570.8845.60.32.36.82.89ASCYA-3MVP-14
\n", "
" ], "text/plain": [ " Year Age Tm Lg W L W-L% ERA G GS GF CG SHO SV IP H \\\n", "0 1995 25 NYY AL 5 3 0.625 5.51 19 10 2 0 0 0 67.0 71 \n", "1 1996 26 NYY AL 8 3 0.727 2.09 61 0 14 0 0 5 107.2 73 \n", "2 1997 27 NYY AL 6 4 0.600 1.88 66 0 56 0 0 43 71.2 65 \n", "3 1998 28 NYY AL 3 0 1.000 1.91 54 0 49 0 0 36 61.1 48 \n", "4 1999 29 NYY AL 4 3 0.571 1.83 66 0 63 0 0 45 69.0 43 \n", "\n", " R ER HR BB IBB SO HBP BK WP BF ERA+ WHIP H/9 HR/9 BB/9 \\\n", "0 43 41 11 30 0 51 2 1 0 301 84 1.507 9.5 1.5 4.0 \n", "1 25 25 1 34 3 130 2 0 1 425 240 0.994 6.1 0.1 2.8 \n", "2 17 15 5 20 6 68 0 0 2 301 239 1.186 8.2 0.6 2.5 \n", "3 13 13 3 17 1 36 1 0 0 246 233 1.060 7.0 0.4 2.5 \n", "4 15 14 2 18 3 52 3 1 2 268 257 0.884 5.6 0.3 2.3 \n", "\n", " SO/9 SO/BB Awards \n", "0 6.9 1.70 NaN \n", "1 10.9 3.82 CYA-3MVP-12 \n", "2 8.5 3.40 ASMVP-25 \n", "3 5.3 2.12 NaN \n", "4 6.8 2.89 ASCYA-3MVP-14 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from_csv = pd.read_csv('mariano-rivera.csv')\n", "from_csv.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Our file had headers, which the function inferred upon reading in the file. Had we wanted to be more explicit, we could have passed `header=None` to the function along with a list of column names to use:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1,1,2012-09-09,DEN,,PIT,W 31-19,3,71,Demaryius Thomas,Trail 7-13,Lead 14-13*\r\n", "2,1,2012-09-09,DEN,,PIT,W 31-19,4,1,Jacob Tamme,Trail 14-19,Lead 22-19*\r\n", "3,2,2012-09-17,DEN,@,ATL,L 21-27,2,17,Demaryius Thomas,Trail 0-20,Trail 7-20\r\n", "4,3,2012-09-23,DEN,,HOU,L 25-31,4,38,Brandon Stokley,Trail 11-31,Trail 18-31\r\n", "5,3,2012-09-23,DEN,,HOU,L 25-31,4,6,Joel Dreessen,Trail 18-31,Trail 25-31\r\n" ] } ], "source": [ "# Source: pro-football-reference.com/players/M/MannPe00/touchdowns/passing/2012/\n", "!head -n 5 peyton-passing-TDs-2012.csv" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numgamedateteamhome_awayopponentresultquarterdistancereceiverscore_beforescore_after
0112012-09-09DENNaNPITW 31-19371Demaryius ThomasTrail 7-13Lead 14-13*
1212012-09-09DENNaNPITW 31-1941Jacob TammeTrail 14-19Lead 22-19*
2322012-09-17DEN@ATLL 21-27217Demaryius ThomasTrail 0-20Trail 7-20
3432012-09-23DENNaNHOUL 25-31438Brandon StokleyTrail 11-31Trail 18-31
4532012-09-23DENNaNHOUL 25-3146Joel DreessenTrail 18-31Trail 25-31
\n", "
" ], "text/plain": [ " num game date team home_away opponent result quarter distance \\\n", "0 1 1 2012-09-09 DEN NaN PIT W 31-19 3 71 \n", "1 2 1 2012-09-09 DEN NaN PIT W 31-19 4 1 \n", "2 3 2 2012-09-17 DEN @ ATL L 21-27 2 17 \n", "3 4 3 2012-09-23 DEN NaN HOU L 25-31 4 38 \n", "4 5 3 2012-09-23 DEN NaN HOU L 25-31 4 6 \n", "\n", " receiver score_before score_after \n", "0 Demaryius Thomas Trail 7-13 Lead 14-13* \n", "1 Jacob Tamme Trail 14-19 Lead 22-19* \n", "2 Demaryius Thomas Trail 0-20 Trail 7-20 \n", "3 Brandon Stokley Trail 11-31 Trail 18-31 \n", "4 Joel Dreessen Trail 18-31 Trail 25-31 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cols = ['num', 'game', 'date', 'team', 'home_away', 'opponent',\n", " 'result', 'quarter', 'distance', 'receiver', 'score_before',\n", " 'score_after']\n", "no_headers = pd.read_csv('peyton-passing-TDs-2012.csv', sep=',', header=None,\n", " names=cols)\n", "no_headers.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "pandas' various *reader* functions have many parameters allowing you to do things like skipping lines of the file, parsing dates, or specifying how to handle NA/NULL datapoints.\n", "\n", "There's also a set of *writer* functions for writing to a variety of formats (CSVs, HTML tables, JSON). They function exactly as you'd expect and are typically called `to_format`:\n", "\n", "```python\n", "my_dataframe.to_csv('path_to_file.csv')\n", "```\n", "\n", "[Take a look at the IO documentation](http://pandas.pydata.org/pandas-docs/stable/io.html) to familiarize yourself with file reading/writing functionality." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Excel**\n", "\n", "Know who hates [VBA](http://en.wikipedia.org/wiki/Visual_Basic_for_Applications)? Me. I bet you do, too. Thankfully, pandas allows you to read and write Excel files, so you can easily read from Excel, write your code in Python, and then write back out to Excel - no need for VBA.\n", "\n", "Reading Excel files requires the [xlrd](https://pypi.python.org/pypi/xlrd) library. You can install it via [pip](http://www.pip-installer.org/en/latest/) (*pip install xlrd*).\n", "\n", "Let's first write a DataFrame to Excel." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yearteamwinslosses
02010Bears115
12011Bears88
22012Bears106
32011Packers151
42012Packers115
\n", "
" ], "text/plain": [ " year team wins losses\n", "0 2010 Bears 11 5\n", "1 2011 Bears 8 8\n", "2 2012 Bears 10 6\n", "3 2011 Packers 15 1\n", "4 2012 Packers 11 5" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this is the DataFrame we created from a dictionary earlier\n", "football.head()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# since our index on the football DataFrame is meaningless, let's not write it\n", "football.to_excel('football.xlsx', index=False)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-rw-r--r--@ 1 gjreda staff 5665 Mar 26 17:58 football.xlsx\r\n" ] } ], "source": [ "!ls -l *.xlsx" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# delete the DataFrame\n", "del football" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yearteamwinslosses
02010Bears115
12011Bears88
22012Bears106
32011Packers151
42012Packers115
52010Lions610
62011Lions106
72012Lions412
\n", "
" ], "text/plain": [ " year team wins losses\n", "0 2010 Bears 11 5\n", "1 2011 Bears 8 8\n", "2 2012 Bears 10 6\n", "3 2011 Packers 15 1\n", "4 2012 Packers 11 5\n", "5 2010 Lions 6 10\n", "6 2011 Lions 10 6\n", "7 2012 Lions 4 12" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# read from Excel\n", "football = pd.read_excel('football.xlsx', 'Sheet1')\n", "football" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Database**\n", "\n", "pandas also has some support for reading/writing DataFrames directly from/to a database [[docs](http://pandas.pydata.org/pandas-docs/stable/io.html#sql-queries)]. You'll typically just need to pass a connection object or sqlalchemy engine to the `read_sql` or `to_sql` functions within the `pandas.io` module.\n", "\n", "Note that `to_sql` executes as a series of INSERT INTO statements and thus trades speed for simplicity. If you're writing a large DataFrame to a database, it might be quicker to write the DataFrame to CSV and load that directly using the database's file import arguments." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tow_datemakestylemodelcolorplatestatetowed_addressphoneinventory
001/19/2013FORDLLREDN786361IL400 E. Lower Wacker(312) 744-7550877040
101/19/2013FORD4DGRNL307211IL701 N. Sacramento(773) 265-76056738005
201/19/2013FORD4DGRYP576738IL701 N. Sacramento(773) 265-76056738001
301/19/2013FORDLLBLKN155890IL10300 S. Doty(773) 568-84952699210
401/19/2013FORDLLTANH953638IL10300 S. Doty(773) 568-84952699209
\n", "
" ], "text/plain": [ " tow_date make style model color plate state towed_address \\\n", "0 01/19/2013 FORD LL RED N786361 IL 400 E. Lower Wacker \n", "1 01/19/2013 FORD 4D GRN L307211 IL 701 N. Sacramento \n", "2 01/19/2013 FORD 4D GRY P576738 IL 701 N. Sacramento \n", "3 01/19/2013 FORD LL BLK N155890 IL 10300 S. Doty \n", "4 01/19/2013 FORD LL TAN H953638 IL 10300 S. Doty \n", "\n", " phone inventory \n", "0 (312) 744-7550 877040 \n", "1 (773) 265-7605 6738005 \n", "2 (773) 265-7605 6738001 \n", "3 (773) 568-8495 2699210 \n", "4 (773) 568-8495 2699209 " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas.io import sql\n", "import sqlite3\n", "\n", "conn = sqlite3.connect('/Users/gjreda/Dropbox/gregreda.com/_code/towed')\n", "query = \"SELECT * FROM towed WHERE make = 'FORD';\"\n", "\n", "results = sql.read_sql(query, con=conn)\n", "results.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Clipboard**\n", "\n", "While the results of a query can be read directly into a DataFrame, I prefer to read the results directly from the clipboard. I'm often tweaking queries in my SQL client ([Sequel Pro](http://www.sequelpro.com/)), so I would rather see the results *before* I read it into pandas. Once I'm confident I have the data I want, then I'll read it into a DataFrame.\n", "\n", "This works just as well with any type of delimited data you've copied to your clipboard. The function does a good job of inferring the delimiter, but you can also use the `sep` parameter to be explicit.\n", "\n", "[Hank Aaron](http://www.baseball-reference.com/players/a/aaronha01.shtml)\n", "\n", "![hank-aaron-stats-screenshot](http://i.imgur.com/xiySJ2e.png)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
YearAgeTmLgGPAABRH2B3BHRRBISBCSBBSOBAOBPSLGOPSOPS+TBGDPHBPSHSFIBBPosAwards
0195420MLNNL1225094685813127613692228390.2800.3220.4470.76910420913364NaN*79RoY-4
11955 ★21MLNNL153665602105189379271063149610.3140.3660.5400.906141325203745*974AS,MVP-9
21956 ★22MLNNL153660609106200341426922437540.3280.3650.5580.923151340212576*9AS,MVP-3
31957 ★23MLNNL151675615118198276441321157580.3220.3780.6000.9781663691300315*98AS,MVP-1
41958 ★24MLNNL15366460110919634430954159490.3260.3860.5460.9311523282110316*98AS,MVP-3,GG
\n", "
" ], "text/plain": [ " Year Age Tm Lg G PA AB R H 2B 3B HR RBI SB CS BB \\\n", "0 1954 20 MLN NL 122 509 468 58 131 27 6 13 69 2 2 28 \n", "1 1955 ★ 21 MLN NL 153 665 602 105 189 37 9 27 106 3 1 49 \n", "2 1956 ★ 22 MLN NL 153 660 609 106 200 34 14 26 92 2 4 37 \n", "3 1957 ★ 23 MLN NL 151 675 615 118 198 27 6 44 132 1 1 57 \n", "4 1958 ★ 24 MLN NL 153 664 601 109 196 34 4 30 95 4 1 59 \n", "\n", " SO BA OBP SLG OPS OPS+ TB GDP HBP SH SF IBB Pos \\\n", "0 39 0.280 0.322 0.447 0.769 104 209 13 3 6 4 NaN *79 \n", "1 61 0.314 0.366 0.540 0.906 141 325 20 3 7 4 5 *974 \n", "2 54 0.328 0.365 0.558 0.923 151 340 21 2 5 7 6 *9 \n", "3 58 0.322 0.378 0.600 0.978 166 369 13 0 0 3 15 *98 \n", "4 49 0.326 0.386 0.546 0.931 152 328 21 1 0 3 16 *98 \n", "\n", " Awards \n", "0 RoY-4 \n", "1 AS,MVP-9 \n", "2 AS,MVP-3 \n", "3 AS,MVP-1 \n", "4 AS,MVP-3,GG " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hank = pd.read_clipboard()\n", "hank.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**URL**\n", "\n", "With `read_table`, we can also read directly from a URL.\n", "\n", "Let's use the [best sandwiches data](https://raw.github.com/gjreda/best-sandwiches/master/data/best-sandwiches-geocode.tsv) that I [wrote about scraping](http://www.gregreda.com/2013/05/06/more-web-scraping-with-python/) a while back." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ranksandwichrestaurantdescriptionpriceaddresscityphonewebsitefull_addressformatted_addresslatlng
01BLTOld Oak TapThe B is applewood smoked&mdash;nice and snapp...$102109 W. Chicago Ave.Chicago773-772-0406theoldoaktap.com2109 W. Chicago Ave., Chicago2109 West Chicago Avenue, Chicago, IL 60622, USA41.895734-87.679960
12Fried BolognaAu ChevalThought your bologna-eating days had retired w...$9800 W. Randolph St.Chicago312-929-4580aucheval.tumblr.com800 W. Randolph St., Chicago800 West Randolph Street, Chicago, IL 60607, USA41.884672-87.647754
23Woodland MushroomXocoLeave it to Rick Bayless and crew to come up w...$9.50.445 N. Clark St.Chicago312-334-3688rickbayless.com445 N. Clark St., Chicago445 North Clark Street, Chicago, IL 60654, USA41.890602-87.630925
\n", "
" ], "text/plain": [ " rank sandwich restaurant \\\n", "0 1 BLT Old Oak Tap \n", "1 2 Fried Bologna Au Cheval \n", "2 3 Woodland Mushroom Xoco \n", "\n", " description price \\\n", "0 The B is applewood smoked—nice and snapp... $10 \n", "1 Thought your bologna-eating days had retired w... $9 \n", "2 Leave it to Rick Bayless and crew to come up w... $9.50. \n", "\n", " address city phone website \\\n", "0 2109 W. Chicago Ave. Chicago 773-772-0406 theoldoaktap.com \n", "1 800 W. Randolph St. Chicago 312-929-4580 aucheval.tumblr.com \n", "2 445 N. Clark St. Chicago 312-334-3688 rickbayless.com \n", "\n", " full_address \\\n", "0 2109 W. Chicago Ave., Chicago \n", "1 800 W. Randolph St., Chicago \n", "2 445 N. Clark St., Chicago \n", "\n", " formatted_address lat lng \n", "0 2109 West Chicago Avenue, Chicago, IL 60622, USA 41.895734 -87.679960 \n", "1 800 West Randolph Street, Chicago, IL 60607, USA 41.884672 -87.647754 \n", "2 445 North Clark Street, Chicago, IL 60654, USA 41.890602 -87.630925 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'https://raw.github.com/gjreda/best-sandwiches/master/data/best-sandwiches-geocode.tsv'\n", "\n", "# fetch the text from the URL and read it into a DataFrame\n", "from_url = pd.read_table(url, sep='\\t')\n", "from_url.head(3)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Google Analytics**\n", "\n", "pandas also has some integration with the Google Analytics API, though there is some setup required. I won't be covering it, but you can read more about it [here](http://blog.yhathq.com/posts/pandas-google-analytics.html) and [here](http://quantabee.wordpress.com/2012/12/17/google-analytics-pandas/)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Working with DataFrames" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Now that we can get data into a DataFrame, we can finally start working with them. pandas has an abundance of functionality, far too much for me to cover in this introduction. I'd encourage anyone interested in diving deeper into the library to check out its [excellent documentation](http://pandas.pydata.org/pandas-docs/stable/). Or just use Google - there are a lot of Stack Overflow questions and blog posts covering specifics of the library.\n", "\n", "We'll be using the [MovieLens](http://www.grouplens.org/node/73) dataset in many examples going forward. The dataset contains 100,000 ratings made by 943 users on 1,682 movies." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# pass in column names for each CSV\n", "u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code']\n", "users = pd.read_csv('ml-100k/u.user', sep='|', names=u_cols,\n", " encoding='latin-1')\n", "\n", "r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp']\n", "ratings = pd.read_csv('ml-100k/u.data', sep='\\t', names=r_cols,\n", " encoding='latin-1')\n", "\n", "# the movies file contains columns indicating the movie's genres\n", "# let's only load the first five columns of the file with usecols\n", "m_cols = ['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url']\n", "movies = pd.read_csv('ml-100k/u.item', sep='|', names=m_cols, usecols=range(5),\n", " encoding='latin-1')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Inspection\n", "\n", "pandas has a variety of functions for getting basic information about your DataFrame, the most basic of which is using the `info` method." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 1682 entries, 0 to 1681\n", "Data columns (total 5 columns):\n", "movie_id 1682 non-null int64\n", "title 1682 non-null object\n", "release_date 1681 non-null object\n", "video_release_date 0 non-null float64\n", "imdb_url 1679 non-null object\n", "dtypes: float64(1), int64(1), object(3)\n", "memory usage: 78.8+ KB\n" ] } ], "source": [ "movies.info()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The output tells a few things about our DataFrame.\n", "\n", "1. It's obviously an instance of a DataFrame.\n", "2. Each row was assigned an index of 0 to N-1, where N is the number of rows in the DataFrame. pandas will do this by default if an index is not specified. Don't worry, this can be changed later.\n", "3. There are 1,682 rows (every row must have an index).\n", "4. Our dataset has five total columns, one of which isn't populated at all (video_release_date) and two that are missing some values (release_date and imdb_url).\n", "5. The last datatypes of each column, but not necessarily in the corresponding order to the listed columns. You should use the `dtypes` method to get the datatype for each column.\n", "6. An approximate amount of RAM used to hold the DataFrame. See the `.memory_usage` method" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "movie_id int64\n", "title object\n", "release_date object\n", "video_release_date float64\n", "imdb_url object\n", "dtype: object" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movies.dtypes" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "DataFrame's also have a `describe` method, which is great for seeing basic statistics about the dataset's numeric columns. Be careful though, since this will return information on **all** columns of a numeric datatype." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idage
count943.000000943.000000
mean472.00000034.051962
std272.36495112.192740
min1.0000007.000000
25%236.50000025.000000
50%472.00000031.000000
75%707.50000043.000000
max943.00000073.000000
\n", "
" ], "text/plain": [ " user_id age\n", "count 943.000000 943.000000\n", "mean 472.000000 34.051962\n", "std 272.364951 12.192740\n", "min 1.000000 7.000000\n", "25% 236.500000 25.000000\n", "50% 472.000000 31.000000\n", "75% 707.500000 43.000000\n", "max 943.000000 73.000000" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users.describe()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Notice *user_id* was included since it's numeric. Since this is an ID value, the stats for it don't really matter.\n", "\n", "We can quickly see the average age of our users is just above 34 years old, with the youngest being 7 and the oldest being 73. The median age is 31, with the youngest quartile of users being 25 or younger, and the oldest quartile being at least 43." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You've probably noticed that I've used the `head` method regularly throughout this post - by default, `head` displays the first five records of the dataset, while `tail` displays the last five." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie_idtitlerelease_datevideo_release_dateimdb_url
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)
\n", "
" ], "text/plain": [ " movie_id title release_date video_release_date \\\n", "0 1 Toy Story (1995) 01-Jan-1995 NaN \n", "1 2 GoldenEye (1995) 01-Jan-1995 NaN \n", "2 3 Four Rooms (1995) 01-Jan-1995 NaN \n", "3 4 Get Shorty (1995) 01-Jan-1995 NaN \n", "4 5 Copycat (1995) 01-Jan-1995 NaN \n", "\n", " imdb_url \n", "0 http://us.imdb.com/M/title-exact?Toy%20Story%2... \n", "1 http://us.imdb.com/M/title-exact?GoldenEye%20(... \n", "2 http://us.imdb.com/M/title-exact?Four%20Rooms%... \n", "3 http://us.imdb.com/M/title-exact?Get%20Shorty%... \n", "4 http://us.imdb.com/M/title-exact?Copycat%20(1995) " ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movies.head()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie_idtitlerelease_datevideo_release_dateimdb_url
16791680Sliding Doors (1998)01-Jan-1998NaNhttp://us.imdb.com/Title?Sliding+Doors+(1998)
16801681You So Crazy (1994)01-Jan-1994NaNhttp://us.imdb.com/M/title-exact?You%20So%20Cr...
16811682Scream of Stone (Schrei aus Stein) (1991)08-Mar-1996NaNhttp://us.imdb.com/M/title-exact?Schrei%20aus%...
\n", "
" ], "text/plain": [ " movie_id title release_date \\\n", "1679 1680 Sliding Doors (1998) 01-Jan-1998 \n", "1680 1681 You So Crazy (1994) 01-Jan-1994 \n", "1681 1682 Scream of Stone (Schrei aus Stein) (1991) 08-Mar-1996 \n", "\n", " video_release_date imdb_url \n", "1679 NaN http://us.imdb.com/Title?Sliding+Doors+(1998) \n", "1680 NaN http://us.imdb.com/M/title-exact?You%20So%20Cr... \n", "1681 NaN http://us.imdb.com/M/title-exact?Schrei%20aus%... " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movies.tail(3)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Alternatively, Python's regular [slicing](http://docs.python.org/release/2.3.5/whatsnew/section-slices.html) syntax works as well." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie_idtitlerelease_datevideo_release_dateimdb_url
2021Muppet Treasure Island (1996)16-Feb-1996NaNhttp://us.imdb.com/M/title-exact?Muppet%20Trea...
2122Braveheart (1995)16-Feb-1996NaNhttp://us.imdb.com/M/title-exact?Braveheart%20...
\n", "
" ], "text/plain": [ " movie_id title release_date video_release_date \\\n", "20 21 Muppet Treasure Island (1996) 16-Feb-1996 NaN \n", "21 22 Braveheart (1995) 16-Feb-1996 NaN \n", "\n", " imdb_url \n", "20 http://us.imdb.com/M/title-exact?Muppet%20Trea... \n", "21 http://us.imdb.com/M/title-exact?Braveheart%20... " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movies[20:22]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Selecting\n", "\n", "You can think of a DataFrame as a group of Series that share an index (in this case the column headers). This makes it easy to select specific columns.\n", "\n", "Selecting a single column from the DataFrame will return a Series object." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "0 technician\n", "1 other\n", "2 writer\n", "3 technician\n", "4 other\n", "Name: occupation, dtype: object" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users['occupation'].head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "To select multiple columns, simply pass a list of column names to the DataFrame, the output of which will be a DataFrame." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " age zip_code\n", "0 24 85711\n", "1 53 94043\n", "2 23 32067\n", "3 24 43537\n", "4 33 15213\n", "\n", "\n", " occupation sex\n", "0 technician M\n", "1 other F\n", "2 writer M\n", "3 technician M\n", "4 other F\n" ] } ], "source": [ "print(users[['age', 'zip_code']].head())\n", "print('\\n')\n", "\n", "# can also store in a variable to use later\n", "columns_you_want = ['occupation', 'sex'] \n", "print(users[columns_you_want].head())" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Row selection can be done multiple ways, but doing so by an individual index or boolean indexing are typically easiest." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " user_id age sex occupation zip_code\n", "1 2 53 F other 94043\n", "4 5 33 F other 15213\n", "5 6 42 M executive 98101\n", "\n", "\n", " user_id age sex occupation zip_code\n", "18 19 40 M librarian 02138\n", "82 83 40 M other 44133\n", "115 116 40 M healthcare 97232\n", "\n", "\n", " user_id age sex occupation zip_code\n", "0 1 24 M technician 85711\n", "1 2 53 F other 94043\n", "2 3 23 M writer 32067\n" ] } ], "source": [ "# users older than 25\n", "print(users[users.age > 25].head(3))\n", "print('\\n')\n", "\n", "# users aged 40 AND male\n", "print(users[(users.age == 40) & (users.sex == 'M')].head(3))\n", "print('\\n')\n", "\n", "# users younger than 30 OR female\n", "print(users[(users.sex == 'F') | (users.age < 30)].head(3))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Since our index is kind of meaningless right now, let's set it to the `user_id` using the `set_index` method. By default, `set_index` returns a new DataFrame, so you'll have to specify if you'd like the changes to occur in place.\n", "\n", "This has confused me in the past, so look carefully at the code and output below." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " age sex occupation zip_code\n", "user_id \n", "1 24 M technician 85711\n", "2 53 F other 94043\n", "3 23 M writer 32067\n", "4 24 M technician 43537\n", "5 33 F other 15213\n", "\n", "\n", " user_id age sex occupation zip_code\n", "0 1 24 M technician 85711\n", "1 2 53 F other 94043\n", "2 3 23 M writer 32067\n", "3 4 24 M technician 43537\n", "4 5 33 F other 15213\n", "\n", "^^^ I didn't actually change the DataFrame. ^^^\n", "\n", " age sex occupation zip_code\n", "user_id \n", "1 24 M technician 85711\n", "2 53 F other 94043\n", "3 23 M writer 32067\n", "4 24 M technician 43537\n", "5 33 F other 15213\n", "\n", "^^^ set_index actually returns a new DataFrame. ^^^\n", "\n" ] } ], "source": [ "print(users.set_index('user_id').head())\n", "print('\\n')\n", "\n", "print(users.head())\n", "print(\"\\n^^^ I didn't actually change the DataFrame. ^^^\\n\")\n", "\n", "with_new_index = users.set_index('user_id')\n", "print(with_new_index.head())\n", "print(\"\\n^^^ set_index actually returns a new DataFrame. ^^^\\n\")" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "If you want to modify your existing DataFrame, use the `inplace` parameter. Most DataFrame methods return new a DataFrames, while offering an `inplace` parameter. Note that the `inplace` version might not actually be any more efficient (in terms of speed or memory usage) than the regular version." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agesexoccupationzip_code
user_id
124Mtechnician85711
253Fother94043
323Mwriter32067
424Mtechnician43537
533Fother15213
\n", "
" ], "text/plain": [ " age sex occupation zip_code\n", "user_id \n", "1 24 M technician 85711\n", "2 53 F other 94043\n", "3 23 M writer 32067\n", "4 24 M technician 43537\n", "5 33 F other 15213" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users.set_index('user_id', inplace=True)\n", "users.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Notice that we've lost the default pandas 0-based index and moved the user_id into its place. We can select rows *by position* using the `iloc` method." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "age 36\n", "sex M\n", "occupation executive\n", "zip_code 90254\n", "Name: 100, dtype: object\n", "\n", "\n", " age sex occupation zip_code\n", "user_id \n", "2 53 F other 94043\n", "51 28 M educator 16509\n", "301 24 M student 55439\n" ] } ], "source": [ "print(users.iloc[99])\n", "print('\\n')\n", "print(users.iloc[[1, 50, 300]])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "And we can select rows *by label* with the `loc` method." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "age 36\n", "sex M\n", "occupation executive\n", "zip_code 90254\n", "Name: 100, dtype: object\n", "\n", "\n", " age sex occupation zip_code\n", "user_id \n", "2 53 F other 94043\n", "51 28 M educator 16509\n", "301 24 M student 55439\n" ] } ], "source": [ "print(users.loc[100])\n", "print('\\n')\n", "print(users.loc[[2, 51, 301]])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "If we realize later that we liked the old pandas default index, we can just `reset_index`. The same rules for `inplace` apply." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user_idagesexoccupationzip_code
0124Mtechnician85711
1253Fother94043
2323Mwriter32067
3424Mtechnician43537
4533Fother15213
\n", "
" ], "text/plain": [ " user_id age sex occupation zip_code\n", "0 1 24 M technician 85711\n", "1 2 53 F other 94043\n", "2 3 23 M writer 32067\n", "3 4 24 M technician 43537\n", "4 5 33 F other 15213" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "users.reset_index(inplace=True)\n", "users.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The simplified rules of indexing are\n", "\n", "- Use `loc` for label-based indexing\n", "- Use `iloc` for positional indexing\n", "\n", "I've found that I can usually get by with boolean indexing, `loc` and `iloc`, but pandas has a whole host of [other ways to do selection](http://pandas.pydata.org/pandas-docs/stable/indexing.html)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Joining\n", "\n", "Throughout an analysis, we'll often need to merge/join datasets as data is typically stored in a [relational](http://en.wikipedia.org/wiki/Relational_database) manner.\n", "\n", "Our MovieLens data is a good example of this - a rating requires both a user and a movie, and the datasets are linked together by a key - in this case, the user_id and movie_id. It's possible for a user to be associated with zero or many ratings and movies. Likewise, a movie can be rated zero or many times, by a number of different users.\n", "\n", "Like SQL's JOIN clause, `pandas.merge` allows two DataFrames to be joined on one or more keys. The function provides a series of parameters `(on, left_on, right_on, left_index, right_index)` allowing you to specify the columns or indexes on which to join.\n", "\n", "By default, `pandas.merge` operates as an *inner join*, which can be changed using the `how` parameter.\n", "\n", "From the function's docstring:\n", "\n", "> how : {'left', 'right', 'outer', 'inner'}, default 'inner'\n", "\n", "> * left: use only keys from left frame (SQL: left outer join)\n", "\n", "> * right: use only keys from right frame (SQL: right outer join)\n", "\n", "> * outer: use union of keys from both frames (SQL: full outer join)\n", "\n", "> * inner: use intersection of keys from both frames (SQL: inner join)\n", "\n", "Below are some examples of what each look like." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " key left_value\n", "0 0 a\n", "1 1 b\n", "2 2 c\n", "3 3 d\n", "4 4 e\n", "\n", "\n", " key right_value\n", "0 2 f\n", "1 3 g\n", "2 4 h\n", "3 5 i\n", "4 6 j\n" ] } ], "source": [ "left_frame = pd.DataFrame({'key': range(5), \n", " 'left_value': ['a', 'b', 'c', 'd', 'e']})\n", "right_frame = pd.DataFrame({'key': range(2, 7), \n", " 'right_value': ['f', 'g', 'h', 'i', 'j']})\n", "print(left_frame)\n", "print('\\n')\n", "print(right_frame)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**inner join (default)**" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valueright_value
02cf
13dg
24eh
\n", "
" ], "text/plain": [ " key left_value right_value\n", "0 2 c f\n", "1 3 d g\n", "2 4 e h" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left_frame, right_frame, on='key', how='inner')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We lose values from both frames since certain keys do not match up. The SQL equivalent is:\n", "\n", "```\n", " SELECT left_frame.key, left_frame.left_value, right_frame.right_value\n", " FROM left_frame\n", " INNER JOIN right_frame\n", " ON left_frame.key = right_frame.key;\n", "```\n", "\n", "Had our *key* columns not been named the same, we could have used the *left_on* and *right_on* parameters to specify which fields to join from each frame.\n", "```python\n", " pd.merge(left_frame, right_frame, left_on='left_key', right_on='right_key')\n", "```\n", "Alternatively, if our keys were indexes, we could use the `left_index` or `right_index` parameters, which accept a True/False value. You can mix and match columns and indexes like so:\n", "```python\n", " pd.merge(left_frame, right_frame, left_on='key', right_index=True)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**left outer join**" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valueright_value
00aNaN
11bNaN
22cf
33dg
44eh
\n", "
" ], "text/plain": [ " key left_value right_value\n", "0 0 a NaN\n", "1 1 b NaN\n", "2 2 c f\n", "3 3 d g\n", "4 4 e h" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left_frame, right_frame, on='key', how='left')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We keep everything from the left frame, pulling in the value from the right frame where the keys match up. The right_value is NULL where keys do not match (NaN).\n", "\n", "SQL Equivalent:\n", "\n", " SELECT left_frame.key, left_frame.left_value, right_frame.right_value\n", " FROM left_frame\n", " LEFT JOIN right_frame\n", " ON left_frame.key = right_frame.key;" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**right outer join**" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valueright_value
02cf
13dg
24eh
35NaNi
46NaNj
\n", "
" ], "text/plain": [ " key left_value right_value\n", "0 2 c f\n", "1 3 d g\n", "2 4 e h\n", "3 5 NaN i\n", "4 6 NaN j" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left_frame, right_frame, on='key', how='right')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This time we've kept everything from the right frame with the left_value being NULL where the right frame's key did not find a match.\n", "\n", "SQL Equivalent:\n", "\n", " SELECT right_frame.key, left_frame.left_value, right_frame.right_value\n", " FROM left_frame\n", " RIGHT JOIN right_frame\n", " ON left_frame.key = right_frame.key;" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**full outer join**" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valueright_value
00aNaN
11bNaN
22cf
33dg
44eh
55NaNi
66NaNj
\n", "
" ], "text/plain": [ " key left_value right_value\n", "0 0 a NaN\n", "1 1 b NaN\n", "2 2 c f\n", "3 3 d g\n", "4 4 e h\n", "5 5 NaN i\n", "6 6 NaN j" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left_frame, right_frame, on='key', how='outer')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We've kept everything from both frames, regardless of whether or not there was a match on both sides. Where there was not a match, the values corresponding to that key are NULL.\n", "\n", "SQL Equivalent (though some databases don't allow FULL JOINs (e.g. MySQL)):\n", "\n", " SELECT IFNULL(left_frame.key, right_frame.key) key\n", " , left_frame.left_value, right_frame.right_value\n", " FROM left_frame\n", " FULL OUTER JOIN right_frame\n", " ON left_frame.key = right_frame.key;" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Combining\n", "\n", "pandas also provides a way to combine DataFrames along an axis - `pandas.concat`. While the function is equivalent to SQL's UNION clause, there's a lot more that can be done with it.\n", "\n", "`pandas.concat` takes a list of Series or DataFrames and returns a Series or DataFrame of the concatenated objects. Note that because the function takes list, you can combine many objects at once." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valueright_value
00aNaN
11bNaN
22cNaN
33dNaN
44eNaN
02NaNf
13NaNg
24NaNh
35NaNi
46NaNj
\n", "
" ], "text/plain": [ " key left_value right_value\n", "0 0 a NaN\n", "1 1 b NaN\n", "2 2 c NaN\n", "3 3 d NaN\n", "4 4 e NaN\n", "0 2 NaN f\n", "1 3 NaN g\n", "2 4 NaN h\n", "3 5 NaN i\n", "4 6 NaN j" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([left_frame, right_frame])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "By default, the function will vertically append the objects to one another, combining columns with the same name. We can see above that values not matching up will be NULL.\n", "\n", "Additionally, objects can be concatentated side-by-side using the function's *axis* parameter." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyleft_valuekeyright_value
00a2f
11b3g
22c4h
33d5i
44e6j
\n", "
" ], "text/plain": [ " key left_value key right_value\n", "0 0 a 2 f\n", "1 1 b 3 g\n", "2 2 c 4 h\n", "3 3 d 5 i\n", "4 4 e 6 j" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([left_frame, right_frame], axis=1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "`pandas.concat` can be used in a variety of ways; however, I've typically only used it to combine Series/DataFrames into one unified object. The [documentation](http://pandas.pydata.org/pandas-docs/stable/merging.html#concatenating-objects) has some examples on the ways it can be used." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Grouping\n", "\n", "Grouping in pandas took some time for me to grasp, but it's pretty awesome once it clicks.\n", "\n", "pandas `groupby` method draws largely from the [split-apply-combine strategy for data analysis](http://www.jstatsoft.org/v40/i01/paper). If you're not familiar with this methodology, I highly suggest you read up on it. It does a great job of illustrating how to properly think through a data problem, which I feel is more important than any technical skill a data analyst/scientist can possess.\n", "\n", "When approaching a data analysis problem, you'll often break it apart into manageable pieces, perform some operations on each of the pieces, and then put everything back together again (this is the gist split-apply-combine strategy). pandas `groupby` is great for these problems (R users should check out the [plyr](http://plyr.had.co.nz/) and [dplyr](https://github.com/hadley/dplyr) packages).\n", "\n", "If you've ever used SQL's GROUP BY or an Excel Pivot Table, you've thought with this mindset, probably without realizing it.\n", "\n", "Assume we have a DataFrame and want to get the average for each group - visually, the split-apply-combine method looks like this:\n", "\n", "![Source: Gratuitously borrowed from [Hadley Wickham's Data Science in R slides](http://courses.had.co.nz/12-oscon/)](http://i.imgur.com/yjNkiwL.png)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The City of Chicago is kind enough to publish all city employee salaries to its open data portal. Let's go through some basic `groupby` examples using this data." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name,Position Title,Department,Employee Annual Salary\r\n", "\"AARON, ELVIA J\",WATER RATE TAKER,WATER MGMNT,$85512.00\r\n", "\"AARON, JEFFERY M\",POLICE OFFICER,POLICE,$75372.00\r\n" ] } ], "source": [ "!head -n 3 city-of-chicago-salaries.csv" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Since the data contains a dollar sign for each salary, python will treat the field as a series of strings. We can use the `converters` parameter to change this when reading in the file.\n", "\n", ">converters : dict. optional\n", "\n", ">* Dict of functions for converting values in certain columns. Keys can either be integers or column labels" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nametitledepartmentsalary
0AARON, ELVIA JWATER RATE TAKERWATER MGMNT85512
1AARON, JEFFERY MPOLICE OFFICERPOLICE75372
2AARON, KIMBERLEI RCHIEF CONTRACT EXPEDITERGENERAL SERVICES80916
3ABAD JR, VICENTE MCIVIL ENGINEER IVWATER MGMNT99648
4ABBATACOLA, ROBERT JELECTRICAL MECHANICAVIATION89440
\n", "
" ], "text/plain": [ " name title department salary\n", "0 AARON, ELVIA J WATER RATE TAKER WATER MGMNT 85512\n", "1 AARON, JEFFERY M POLICE OFFICER POLICE 75372\n", "2 AARON, KIMBERLEI R CHIEF CONTRACT EXPEDITER GENERAL SERVICES 80916\n", "3 ABAD JR, VICENTE M CIVIL ENGINEER IV WATER MGMNT 99648\n", "4 ABBATACOLA, ROBERT J ELECTRICAL MECHANIC AVIATION 89440" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "headers = ['name', 'title', 'department', 'salary']\n", "chicago = pd.read_csv('city-of-chicago-salaries.csv', \n", " header=0,\n", " names=headers,\n", " converters={'salary': lambda x: float(x.replace('$', ''))})\n", "chicago.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "pandas `groupby` returns a DataFrameGroupBy object which has a variety of methods, many of which are similar to standard SQL aggregate functions." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "by_dept = chicago.groupby('department')\n", "by_dept" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Calling `count` returns the total number of NOT NULL values within each column. If we were interested in the total number of records in each group, we could use `size`." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name title salary\n", "department \n", "ADMIN HEARNG 42 42 42\n", "ANIMAL CONTRL 61 61 61\n", "AVIATION 1218 1218 1218\n", "BOARD OF ELECTION 110 110 110\n", "BOARD OF ETHICS 9 9 9\n", "\n", "\n", "department\n", "PUBLIC LIBRARY 926\n", "STREETS & SAN 2070\n", "TRANSPORTN 1168\n", "TREASURER 25\n", "WATER MGMNT 1857\n", "dtype: int64\n" ] } ], "source": [ "print(by_dept.count().head()) # NOT NULL records within each column\n", "print('\\n')\n", "print(by_dept.size().tail()) # total records for each department" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Summation can be done via `sum`, averaging by `mean`, etc. (if it's a SQL function, chances are it exists in pandas). Oh, and there's median too, something not available in most databases." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " salary\n", "department \n", "HUMAN RESOURCES 4850928.0\n", "INSPECTOR GEN 4035150.0\n", "IPRA 7006128.0\n", "LAW 31883920.2\n", "LICENSE APPL COMM 65436.0\n", "\n", "\n", " salary\n", "department \n", "HUMAN RESOURCES 71337.176471\n", "INSPECTOR GEN 80703.000000\n", "IPRA 82425.035294\n", "LAW 70853.156000\n", "LICENSE APPL COMM 65436.000000\n", "\n", "\n", " salary\n", "department \n", "HUMAN RESOURCES 68496\n", "INSPECTOR GEN 76116\n", "IPRA 82524\n", "LAW 66492\n", "LICENSE APPL COMM 65436\n" ] } ], "source": [ "print(by_dept.sum()[20:25]) # total salaries of each department\n", "print('\\n')\n", "print(by_dept.mean()[20:25]) # average salary of each department\n", "print('\\n')\n", "print(by_dept.median()[20:25]) # take that, RDBMS!" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Operations can also be done on an individual Series within a grouped object. Say we were curious about the five departments with the most distinct titles - the pandas equivalent to:\n", "\n", " SELECT department, COUNT(DISTINCT title)\n", " FROM chicago\n", " GROUP BY department\n", " ORDER BY 2 DESC\n", " LIMIT 5;\n", "\n", "pandas is a lot less verbose here ..." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "department\n", "WATER MGMNT 153\n", "TRANSPORTN 150\n", "POLICE 130\n", "AVIATION 125\n", "HEALTH 118\n", "Name: title, dtype: int64" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "by_dept.title.nunique().sort_values(ascending=False)[:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### split-apply-combine\n", "\n", "The real power of `groupby` comes from it's split-apply-combine ability.\n", "\n", "What if we wanted to see the highest paid employee within each department. Given our current dataset, we'd have to do something like this in SQL:\n", "\n", " SELECT *\n", " FROM chicago c\n", " INNER JOIN (\n", " SELECT department, max(salary) max_salary\n", " FROM chicago\n", " GROUP BY department\n", " ) m\n", " ON c.department = m.department\n", " AND c.salary = m.max_salary;\n", " \n", "This would give you the highest paid person in each department, but it would return multiple if there were many equally high paid people within a department.\n", "\n", "Alternatively, you could alter the table, add a column, and then write an update statement to populate that column. However, that's not always an option.\n", "\n", "_Note: This would be a lot easier in PostgreSQL, T-SQL, and possibly Oracle due to the existence of partition/window/analytic functions. I've chosen to use MySQL syntax throughout this tutorial because of it's popularity. Unfortunately, MySQL doesn't have similar functions._" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Using `groupby` we can define a function (which we'll call `ranker`) that will label each record from 1 to N, where N is the number of employees within the department. We can then call `apply` to, well, _apply_ that function to each group (in this case, each department)." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "def ranker(df):\n", " \"\"\"Assigns a rank to each employee based on salary, with 1 being the highest paid.\n", " Assumes the data is DESC sorted.\"\"\"\n", " df['dept_rank'] = np.arange(len(df)) + 1\n", " return df" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name title department \\\n", "18039 MC CARTHY, GARRY F SUPERINTENDENT OF POLICE POLICE \n", "8004 EMANUEL, RAHM MAYOR MAYOR'S OFFICE \n", "25588 SANTIAGO, JOSE A FIRE COMMISSIONER FIRE \n", "763 ANDOLINO, ROSEMARIE S COMMISSIONER OF AVIATION AVIATION \n", "4697 CHOUCAIR, BECHARA N COMMISSIONER OF HEALTH HEALTH \n", "21971 PATTON, STEPHEN R CORPORATION COUNSEL LAW \n", "12635 HOLT, ALEXANDRA D BUDGET DIR BUDGET & MGMT \n", "\n", " salary dept_rank \n", "18039 260004 1 \n", "8004 216210 1 \n", "25588 202728 1 \n", "763 186576 1 \n", "4697 177156 1 \n", "21971 173664 1 \n", "12635 169992 1 \n" ] } ], "source": [ "chicago.sort_values('salary', ascending=False, inplace=True)\n", "chicago = chicago.groupby('department').apply(ranker)\n", "print(chicago[chicago.dept_rank == 1].head(7))" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nametitledepartmentsalarydept_rank
21971PATTON, STEPHEN RCORPORATION COUNSELLAW1736641
6311DARLING, LESLIE MFIRST ASST CORPORATION COUNSELLAW1491602
17680MARTINICO, JOSEPH PCHIEF LABOR NEGOTIATORLAW1440363
22357PETERS, LYNDA ACITY PROSECUTORLAW1399324
31383WONG JR, EDWARD JDEPUTY CORPORATION COUNSELLAW1370765
\n", "
" ], "text/plain": [ " name title department \\\n", "21971 PATTON, STEPHEN R CORPORATION COUNSEL LAW \n", "6311 DARLING, LESLIE M FIRST ASST CORPORATION COUNSEL LAW \n", "17680 MARTINICO, JOSEPH P CHIEF LABOR NEGOTIATOR LAW \n", "22357 PETERS, LYNDA A CITY PROSECUTOR LAW \n", "31383 WONG JR, EDWARD J DEPUTY CORPORATION COUNSEL LAW \n", "\n", " salary dept_rank \n", "21971 173664 1 \n", "6311 149160 2 \n", "17680 144036 3 \n", "22357 139932 4 \n", "31383 137076 5 " ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chicago[chicago.department == \"LAW\"][:5]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We can now see where each employee ranks within their department based on salary." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Using pandas on the MovieLens dataset" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "To show pandas in a more \"applied\" sense, let's use it to answer some questions about the [MovieLens](http://www.grouplens.org/datasets/movielens/) dataset. Recall that we've already read our data into DataFrames and merged it." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# pass in column names for each CSV\n", "u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code']\n", "users = pd.read_csv('ml-100k/u.user', sep='|', names=u_cols,\n", " encoding='latin-1')\n", "\n", "r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp']\n", "ratings = pd.read_csv('ml-100k/u.data', sep='\\t', names=r_cols,\n", " encoding='latin-1')\n", "\n", "# the movies file contains columns indicating the movie's genres\n", "# let's only load the first five columns of the file with usecols\n", "m_cols = ['movie_id', 'title', 'release_date', 'video_release_date', 'imdb_url']\n", "movies = pd.read_csv('ml-100k/u.item', sep='|', names=m_cols, usecols=range(5),\n", " encoding='latin-1')\n", "\n", "# create one merged DataFrame\n", "movie_ratings = pd.merge(movies, ratings)\n", "lens = pd.merge(movie_ratings, users)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**What are the 25 most rated movies?**" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "title\n", "Star Wars (1977) 583\n", "Contact (1997) 509\n", "Fargo (1996) 508\n", "Return of the Jedi (1983) 507\n", "Liar Liar (1997) 485\n", "English Patient, The (1996) 481\n", "Scream (1996) 478\n", "Toy Story (1995) 452\n", "Air Force One (1997) 431\n", "Independence Day (ID4) (1996) 429\n", "Raiders of the Lost Ark (1981) 420\n", "Godfather, The (1972) 413\n", "Pulp Fiction (1994) 394\n", "Twelve Monkeys (1995) 392\n", "Silence of the Lambs, The (1991) 390\n", "Jerry Maguire (1996) 384\n", "Chasing Amy (1997) 379\n", "Rock, The (1996) 378\n", "Empire Strikes Back, The (1980) 367\n", "Star Trek: First Contact (1996) 365\n", "Back to the Future (1985) 350\n", "Titanic (1997) 350\n", "Mission: Impossible (1996) 344\n", "Fugitive, The (1993) 336\n", "Indiana Jones and the Last Crusade (1989) 331\n", "dtype: int64" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "most_rated = lens.groupby('title').size().sort_values(ascending=False)[:25]\n", "most_rated" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "There's a lot going on in the code above, but it's very idomatic. We're splitting the DataFrame into groups by movie title and applying the `size` method to get the count of records in each group. Then we order our results in descending order and limit the output to the top 25 using Python's slicing syntax.\n", "\n", "In SQL, this would be equivalent to:\n", "\n", " SELECT title, count(1)\n", " FROM lens\n", " GROUP BY title\n", " ORDER BY 2 DESC\n", " LIMIT 25;\n", "\n", "Alternatively, pandas has a nifty `value_counts` method - yes, this is simpler - the goal above was to show a basic `groupby` example." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "Star Wars (1977) 583\n", "Contact (1997) 509\n", "Fargo (1996) 508\n", "Return of the Jedi (1983) 507\n", "Liar Liar (1997) 485\n", "English Patient, The (1996) 481\n", "Scream (1996) 478\n", "Toy Story (1995) 452\n", "Air Force One (1997) 431\n", "Independence Day (ID4) (1996) 429\n", "Raiders of the Lost Ark (1981) 420\n", "Godfather, The (1972) 413\n", "Pulp Fiction (1994) 394\n", "Twelve Monkeys (1995) 392\n", "Silence of the Lambs, The (1991) 390\n", "Jerry Maguire (1996) 384\n", "Chasing Amy (1997) 379\n", "Rock, The (1996) 378\n", "Empire Strikes Back, The (1980) 367\n", "Star Trek: First Contact (1996) 365\n", "Titanic (1997) 350\n", "Back to the Future (1985) 350\n", "Mission: Impossible (1996) 344\n", "Fugitive, The (1993) 336\n", "Indiana Jones and the Last Crusade (1989) 331\n", "Name: title, dtype: int64" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lens.title.value_counts()[:25]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Which movies are most highly rated?**" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
sizemean
title
'Til There Was You (1997)92.333333
1-900 (1994)52.600000
101 Dalmatians (1996)1092.908257
12 Angry Men (1957)1254.344000
187 (1997)413.024390
\n", "
" ], "text/plain": [ " rating \n", " size mean\n", "title \n", "'Til There Was You (1997) 9 2.333333\n", "1-900 (1994) 5 2.600000\n", "101 Dalmatians (1996) 109 2.908257\n", "12 Angry Men (1957) 125 4.344000\n", "187 (1997) 41 3.024390" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]})\n", "movie_stats.head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We can use the `agg` method to pass a dictionary specifying the columns to aggregate (as keys) and a list of functions we'd like to apply.\n", "\n", "Let's sort the resulting DataFrame so that we can see which movies have the highest average score." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
sizemean
title
They Made Me a Criminal (1939)15
Marlene Dietrich: Shadow and Light (1996)15
Saint of Fort Washington, The (1993)25
Someone Else's America (1995)15
Star Kid (1997)35
\n", "
" ], "text/plain": [ " rating \n", " size mean\n", "title \n", "They Made Me a Criminal (1939) 1 5\n", "Marlene Dietrich: Shadow and Light (1996) 1 5\n", "Saint of Fort Washington, The (1993) 2 5\n", "Someone Else's America (1995) 1 5\n", "Star Kid (1997) 3 5" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sort by rating average\n", "movie_stats.sort_values([('rating', 'mean')], ascending=False).head()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Because `movie_stats` is a DataFrame, we use the `sort` method - only Series objects use `order`. Additionally, because our columns are now a [MultiIndex](http://pandas.pydata.org/pandas-docs/stable/indexing.html#hierarchical-indexing-multiindex), we need to pass in a tuple specifying how to sort.\n", "\n", "The above movies are rated so rarely that we can't count them as quality films. Let's only look at movies that have been rated at least 100 times." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
sizemean
title
Close Shave, A (1995)1124.491071
Schindler's List (1993)2984.466443
Wrong Trousers, The (1993)1184.466102
Casablanca (1942)2434.456790
Shawshank Redemption, The (1994)2834.445230
Rear Window (1954)2094.387560
Usual Suspects, The (1995)2674.385768
Star Wars (1977)5834.358491
12 Angry Men (1957)1254.344000
Citizen Kane (1941)1984.292929
To Kill a Mockingbird (1962)2194.292237
One Flew Over the Cuckoo's Nest (1975)2644.291667
Silence of the Lambs, The (1991)3904.289744
North by Northwest (1959)1794.284916
Godfather, The (1972)4134.283293
\n", "
" ], "text/plain": [ " rating \n", " size mean\n", "title \n", "Close Shave, A (1995) 112 4.491071\n", "Schindler's List (1993) 298 4.466443\n", "Wrong Trousers, The (1993) 118 4.466102\n", "Casablanca (1942) 243 4.456790\n", "Shawshank Redemption, The (1994) 283 4.445230\n", "Rear Window (1954) 209 4.387560\n", "Usual Suspects, The (1995) 267 4.385768\n", "Star Wars (1977) 583 4.358491\n", "12 Angry Men (1957) 125 4.344000\n", "Citizen Kane (1941) 198 4.292929\n", "To Kill a Mockingbird (1962) 219 4.292237\n", "One Flew Over the Cuckoo's Nest (1975) 264 4.291667\n", "Silence of the Lambs, The (1991) 390 4.289744\n", "North by Northwest (1959) 179 4.284916\n", "Godfather, The (1972) 413 4.283293" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "atleast_100 = movie_stats['rating']['size'] >= 100\n", "movie_stats[atleast_100].sort_values([('rating', 'mean')], ascending=False)[:15]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Those results look realistic. Notice that we used boolean indexing to filter our `movie_stats` frame.\n", "\n", "We broke this question down into many parts, so here's the Python needed to get the 15 movies with the highest average rating, requiring that they had at least 100 ratings:\n", "\n", "```python\n", " movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]})\n", " atleast_100 = movie_stats['rating'].size >= 100\n", " movie_stats[atleast_100].sort_values([('rating', 'mean')], ascending=False)[:15]\n", "```\n", "\n", "The SQL equivalent would be:\n", "\n", " SELECT title, COUNT(1) size, AVG(rating) mean\n", " FROM lens\n", " GROUP BY title\n", " HAVING COUNT(1) >= 100\n", " ORDER BY 3 DESC\n", " LIMIT 15;" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Limiting our population going forward**\n", "\n", "Going forward, let's only look at the 50 most rated movies. Let's make a Series of movies that meet this threshold so we can use it for filtering later." ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "most_50 = lens.groupby('movie_id').size().sort_values(ascending=False)[:50]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The SQL to match this would be:\n", "\n", " CREATE TABLE most_50 AS (\n", " SELECT movie_id, COUNT(1)\n", " FROM lens\n", " GROUP BY movie_id\n", " ORDER BY 2 DESC\n", " LIMIT 50\n", " );\n", " \n", "This table would then allow us to use EXISTS, IN, or JOIN whenever we wanted to filter our results. Here's an example using EXISTS:\n", "\n", " SELECT *\n", " FROM lens\n", " WHERE EXISTS (SELECT 1 FROM most_50 WHERE lens.movie_id = most_50.movie_id);" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Which movies are most controversial amongst different ages?**" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Let's look at how these movies are viewed across different age groups. First, let's look at how age is distributed amongst our users." ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "users.age.plot.hist(bins=30)\n", "plt.title(\"Distribution of users' ages\")\n", "plt.ylabel('count of users')\n", "plt.xlabel('age');" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "pandas' integration with [matplotlib](http://matplotlib.org/index.html) makes basic graphing of Series/DataFrames trivial. In this case, just call `hist` on the column to produce a histogram. We can also use [matplotlib.pyplot](http://matplotlib.org/users/pyplot_tutorial.html) to customize our graph a bit (always label your axes)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Binning our users**\n", "\n", "I don't think it'd be very useful to compare individual ages - let's bin our users into age groups using `pandas.cut`." ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageage_group
06060-69
3972120-29
4593330-39
5243030-39
7822320-29
9952920-29
12292620-29
16643130-39
19422420-29
22703230-39
\n", "
" ], "text/plain": [ " age age_group\n", "0 60 60-69\n", "397 21 20-29\n", "459 33 30-39\n", "524 30 30-39\n", "782 23 20-29\n", "995 29 20-29\n", "1229 26 20-29\n", "1664 31 30-39\n", "1942 24 20-29\n", "2270 32 30-39" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60-69', '70-79']\n", "lens['age_group'] = pd.cut(lens.age, range(0, 81, 10), right=False, labels=labels)\n", "lens[['age', 'age_group']].drop_duplicates()[:10]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "`pandas.cut` allows you to bin numeric data. In the above lines, we first created labels to name our bins, then split our users into eight bins of ten years (0-9, 10-19, 20-29, etc.). Our use of `right=False` told the function that we wanted the bins to be *exclusive* of the max age in the bin (e.g. a 30 year old user gets the 30s label).\n", "\n", "Now we can now compare ratings across age groups." ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
sizemean
age_group
0-9433.767442
10-1981813.486126
20-29395353.467333
30-39256963.554444
40-49150213.591772
50-5987043.635800
60-6926233.648875
70-791973.649746
\n", "
" ], "text/plain": [ " rating \n", " size mean\n", "age_group \n", "0-9 43 3.767442\n", "10-19 8181 3.486126\n", "20-29 39535 3.467333\n", "30-39 25696 3.554444\n", "40-49 15021 3.591772\n", "50-59 8704 3.635800\n", "60-69 2623 3.648875\n", "70-79 197 3.649746" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lens.groupby('age_group').agg({'rating': [np.size, np.mean]})" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Young users seem a bit more critical than other age groups. Let's look at how the 50 most rated movies are viewed across each age group. We can use the `most_50` Series we created earlier for filtering." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "lens.set_index('movie_id', inplace=True)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "title age_group\n", "Air Force One (1997) 10-19 3.647059\n", " 20-29 3.666667\n", " 30-39 3.570000\n", " 40-49 3.555556\n", " 50-59 3.750000\n", " 60-69 3.666667\n", " 70-79 3.666667\n", "Alien (1979) 10-19 4.111111\n", " 20-29 4.026087\n", " 30-39 4.103448\n", " 40-49 3.833333\n", " 50-59 4.272727\n", " 60-69 3.500000\n", " 70-79 4.000000\n", "Aliens (1986) 10-19 4.050000\n", "Name: rating, dtype: float64" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "by_age = lens.loc[most_50.index].groupby(['title', 'age_group'])\n", "by_age.rating.mean().head(15)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Notice that both the title and age group are indexes here, with the average rating value being a Series. This is going to produce a really long list of values.\n", "\n", "Wouldn't it be nice to see the data as a table? Each title as a row, each age group as a column, and the average rating in each cell.\n", "\n", "Behold! The magic of `unstack`!" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age_group0-910-1920-2930-3940-4950-5960-6970-79
title
E.T. the Extra-Terrestrial (1982)03.6800003.6090913.8068184.1600004.3684214.3750000.000000
Empire Strikes Back, The (1980)44.6428574.3116884.0520834.1000003.9090914.2500005.000000
English Patient, The (1996)53.7391303.5714293.6218493.6346153.7746483.9047624.500000
Fargo (1996)03.9375004.0104714.2307694.2941184.4423084.0000004.333333
Forrest Gump (1994)54.0476193.7857143.8617023.8478264.0000003.8000000.000000
Fugitive, The (1993)04.3200003.9699253.9814814.1904764.2400003.6666670.000000
Full Monty, The (1997)03.4210534.0568183.9333333.7142864.1463414.1666673.500000
Godfather, The (1972)04.4000004.3450704.4128443.9294124.4634154.1250000.000000
Groundhog Day (1993)03.4761903.7982463.7866673.8510643.5714293.5714294.000000
Independence Day (ID4) (1996)03.5952383.2914293.3893813.7187503.8888892.7500000.000000
\n", "
" ], "text/plain": [ "age_group 0-9 10-19 20-29 30-39 \\\n", "title \n", "E.T. the Extra-Terrestrial (1982) 0 3.680000 3.609091 3.806818 \n", "Empire Strikes Back, The (1980) 4 4.642857 4.311688 4.052083 \n", "English Patient, The (1996) 5 3.739130 3.571429 3.621849 \n", "Fargo (1996) 0 3.937500 4.010471 4.230769 \n", "Forrest Gump (1994) 5 4.047619 3.785714 3.861702 \n", "Fugitive, The (1993) 0 4.320000 3.969925 3.981481 \n", "Full Monty, The (1997) 0 3.421053 4.056818 3.933333 \n", "Godfather, The (1972) 0 4.400000 4.345070 4.412844 \n", "Groundhog Day (1993) 0 3.476190 3.798246 3.786667 \n", "Independence Day (ID4) (1996) 0 3.595238 3.291429 3.389381 \n", "\n", "age_group 40-49 50-59 60-69 70-79 \n", "title \n", "E.T. the Extra-Terrestrial (1982) 4.160000 4.368421 4.375000 0.000000 \n", "Empire Strikes Back, The (1980) 4.100000 3.909091 4.250000 5.000000 \n", "English Patient, The (1996) 3.634615 3.774648 3.904762 4.500000 \n", "Fargo (1996) 4.294118 4.442308 4.000000 4.333333 \n", "Forrest Gump (1994) 3.847826 4.000000 3.800000 0.000000 \n", "Fugitive, The (1993) 4.190476 4.240000 3.666667 0.000000 \n", "Full Monty, The (1997) 3.714286 4.146341 4.166667 3.500000 \n", "Godfather, The (1972) 3.929412 4.463415 4.125000 0.000000 \n", "Groundhog Day (1993) 3.851064 3.571429 3.571429 4.000000 \n", "Independence Day (ID4) (1996) 3.718750 3.888889 2.750000 0.000000 " ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "by_age.rating.mean().unstack(1).fillna(0)[10:20]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "`unstack`, well, unstacks the specified level of a [MultiIndex](http://pandas.pydata.org/pandas-docs/stable/indexing.html#hierarchical-indexing-multiindex) (by default, `groupby` turns the grouped field into an index - since we grouped by two fields, it became a MultiIndex). We unstacked the second index (remember that Python uses 0-based indexes), and then filled in NULL values with 0.\n", "\n", "If we would have used:\n", "```python\n", " by_age.rating.mean().unstack(0).fillna(0)\n", "```\n", "We would have had our age groups as rows and movie titles as columns." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "**Which movies do men and women most disagree on?**\n", "\n", "EDIT: *I realized after writing this question that Wes McKinney basically went through the exact same question in his book. It's a good, yet simple example of pivot_table, so I'm going to leave it here. Seriously though, [go buy the book](http://www.amazon.com/gp/product/1449319793/ref=as_li_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=1449319793&linkCode=as2&tag=gjreda-20&linkId=MCGW4C4NOBRVV5OC).*\n", "\n", "Think about how you'd have to do this in SQL for a second. You'd have to use a combination of IF/CASE statements with aggregate functions in order to pivot your dataset. Your query would look something like this:\n", "\n", " SELECT title, AVG(IF(sex = 'F', rating, NULL)), AVG(IF(sex = 'M', rating, NULL))\n", " FROM lens\n", " GROUP BY title;\n", " \n", "Imagine how annoying it'd be if you had to do this on more than two columns.\n", " \n", "DataFrame's have a *pivot_table* method that makes these kinds of operations much easier (and less verbose)." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "lens.reset_index('movie_id', inplace=True)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sexFM
movie_idtitle
1Toy Story (1995)3.7899163.909910
2GoldenEye (1995)3.3684213.178571
3Four Rooms (1995)2.6875003.108108
4Get Shorty (1995)3.4000003.591463
5Copycat (1995)3.7727273.140625
\n", "
" ], "text/plain": [ "sex F M\n", "movie_id title \n", "1 Toy Story (1995) 3.789916 3.909910\n", "2 GoldenEye (1995) 3.368421 3.178571\n", "3 Four Rooms (1995) 2.687500 3.108108\n", "4 Get Shorty (1995) 3.400000 3.591463\n", "5 Copycat (1995) 3.772727 3.140625" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pivoted = lens.pivot_table(index=['movie_id', 'title'],\n", " columns=['sex'],\n", " values='rating',\n", " fill_value=0)\n", "pivoted.head()" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sexFMdiff
movie_idtitle
1Toy Story (1995)3.7899163.9099100.119994
2GoldenEye (1995)3.3684213.178571-0.189850
3Four Rooms (1995)2.6875003.1081080.420608
4Get Shorty (1995)3.4000003.5914630.191463
5Copycat (1995)3.7727273.140625-0.632102
\n", "
" ], "text/plain": [ "sex F M diff\n", "movie_id title \n", "1 Toy Story (1995) 3.789916 3.909910 0.119994\n", "2 GoldenEye (1995) 3.368421 3.178571 -0.189850\n", "3 Four Rooms (1995) 2.687500 3.108108 0.420608\n", "4 Get Shorty (1995) 3.400000 3.591463 0.191463\n", "5 Copycat (1995) 3.772727 3.140625 -0.632102" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pivoted['diff'] = pivoted.M - pivoted.F\n", "pivoted.head()" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "pivoted.reset_index('movie_id', inplace=True)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n+McpIYQQ4hGwtrZWUVFR2vqePXtUzZo1C6TbvXu30uv16saNG0oppXQ6nYqLi1NKKTV58mQ1YMAA\nLW14eLhJGRcuXFCVK1dWO3fuVEop9eOPP6rKlSurv//+WymlVJs2bZSDg4M6efKkysnJUVeuXFE1\na9ZUy5YtUzk5OSo6OlpVqVJFnTx5Uiml1KBBg1TlypXVoUOHVHZ2turXr5966aWXlFJKXbt2TVWv\nXl199tln6tatWyotLU0dPHhQKaXUf//7X+Xj46MSExNVZmamev3111WfPn2KPDcXL15Us2fPVq6u\nrsrBwUH95z//UWfPnr3r+ezWrZuaOXOmyTYLCwt15MiRQtMHBASoihUrFrp07dq1yHp0Op2KjY01\n2RYbG6v+97//qczMTJWcnKxat26t3n77baWUUgkJCaps2bIqLS1NKaVUdna2srGx0c5Nq1at1Ftv\nvaVu3bqlfv31V2Vtba3CwsKUUkpNmjRJlSpVSm3ZskUppVRGRobq3r27GjZsmLpx44a6dOmS8vLy\nUl9//bVSSqmFCxcqZ2dndeHCBZWSkqJ8fX2VXq9XOTk5hR6Lg4ODcnV11dK3aNFCffjhh0oppWbO\nnKmCgoK0tJs3b1Zubm6FlpP/3d2/f7/y9vZWSim1Y8cO1aFDB/XNN98oX19fpZRS6enpD/z9yhcY\nGKjmzZtX5OcjxOMiIwVCCCEeiStXrmBhYXHPdDVq1EApxZUrVwrsU3dM+VF3TP9ZuXIlnTt31l4k\n9fzzz9OkSROtB1mn0zF48GAaNGiAXq9n165d1KpVi0GDBqHX63F3d6dnz54mvbk9e/akSZMmGAwG\n+vXrx6+//grA9u3bqVGjBqNHj8bMzIzy5cvj5eUFwNdff83HH39MjRo1KFWqFJMmTSIkJKTIUYBq\n1arx7rvvcvToUTZu3MiVK1fw9vbGz8+Po0ePFponPT2dChUqmGyztLQkLS2t0PTbt28nNTW10GXr\n1q2F5snn6emJlZUVVlZWvP3229SuXZt27dpRqlQpqlSpwujRo7URGXt7ezw9Pdm0aRMAYWFhlC1b\nFi8vL86fP8/+/fuZMWMGZmZmGI1GXnnlFVasWKHV1bx5cwIDAwG4evUqO3fu5PPPP6dMmTJYW1vz\n9ttva73zwcHBjB49GltbW6ysrBg/fvxdp4TpdDqGDx+upZ8wYQJr1qwBoF+/fuzYsYP09HQAvvvu\nOwYMGHDX8+Lj40NKSgq//fYbK1asKPBG4+3btz/w9yufhYVFob8LQjxuzz3pBgghhHg2WFlZFXnB\nervExER0Oh0VK1Ysdh0JCQmsX7+ebdu2aduys7Np27attm5nZ2eS/uDBg1hZWZmkHzhwIJB3EXn7\nS6nKlCmjXTSeP38eJyenQtsRHx9Pjx49tHsfAJ577jn++usvbGxs7noMderUwc3NjaioKM6cOVPk\n/Qbly5cvsO/q1av3FXgVV3R0tMmx/vXXX4waNYqff/6ZtLQ0cnNzTW5A7tu3L2vWrGHAgAGsXr2a\nfv36AXlThypVqkS5cuW0tPb29iY3l9esWVP7OSEhgaysLJNzlpubi729PQBJSUkmn2f+9ru5M33+\nDeo1atSgRYsWhISE0L17d3bt2sX8+fPvWd6AAQOYP38+4eHhLFu2jJUrV5q0/0G/X/nS0tJM8gvx\npEhQIIQQ4pFwc3PjzJkzNG7c+K7pNm3aROPGjSlTpkyx67C3t2fAgAEsWrSoyDS33wRqb29PmzZt\nCA0NfaC61q1bV+S+pUuX4uPjc19l5eTkEBoayooVK9i1axft2rVj/PjxdOrUySSwuF2jRo1M5rvH\nxcWRmZlJvXr1Ck3fqVMnfv7550L3tW7d+r7m4+cbP348BoOB48ePU7FiRTZv3syIESO0/b169eLd\nd98lMTGRzZs3c+DAASDvwjslJYX09HTKly8P5N0sfnsgcPvnY2dnh7m5OZcvXy70PNjY2HDu3Dlt\n/fafi3Jn+tsfZTto0CCWLFlCVlYWzZs3v2cAB9C/f3/q1q3LoEGDKF26tMm+h/l+5Tt16hRjxox5\n4PxCPCoyfUgIIcQj0blzZ5Obfm+nlCIxMZEpU6awZMkSpk2b9kB19O/fn23bthEaGkpOTg43b94k\nPDycxMREk7rydenShd9++42VK1eSlZVFVlYWhw4d4vTp0wXS3ikgIICkpCTmzp3LrVu3SEtLIzIy\nEoBhw4Yxfvx47QI0OTm5yCk6ly5dombNmnz44Yc0b96cuLg4QkJCCAgIKDIggLzpLtu2bePnn3/m\n+vXrTJw4kRdeeMGkF/52O3fu1J4gdOdSnIAA8qYulStXDktLSxITE5k1a5bJfmtra3x9fRk8eDBO\nTk7Ur18fyLvIb968OePGjePWrVscPXqUb7/9lv79+xdaj42NDf7+/rzzzjvaiERcXBwREREAvPji\ni8ybN4/ExERSU1Pv+fhOpRRffPEFiYmJpKSk8Mknn/DSSy9p+3v06MGRI0eYN2+e1pt/L7Vq1SIi\nIoJPPvmkwL6AgIAH/n4BWjubNWt2X20R4p8kQYEQQohHYuDAgXz//ffcvHkTyOsRzn9ykIWFBV5e\nXpw4cYK9e/fy/PPPa/lu7zku7Dnzt6/XrFmTLVu2MG3aNKpWrYq9vT1z5swxufi6PX358uUJDQ1l\n7dq12NraYmNjw7hx48jMzLxnfRYWFvz4449s27YNGxsb6tWrR3h4OJD3tJ3AwED8/f2xtLTEx8dH\nCxjuVK5cOUJDQzl8+DAjRoy47/cANGzYkK+++op+/fpRrVo1MjIy+PLLL+8rb3EU9njNSZMmceTI\nESpUqEDXrl154YUXCqTr27cvu3fvpm/fvibb16xZQ3x8PDVq1KBnz5589NFH2vSuws73ihUryMzM\npGHDhlSqVInevXtz8eJFAF599VU6dOiA0WikSZMmhbbjzmPp168f/v7+1K5dm7p16/Lhhx9q+0uX\nLk3Pnj2Jj48v8A6Cu52X5s2bU7169QLHYGFh8cDfL8h7D8XgwYMpVarUXdsixOOgU/cKY4UQQoj7\nNGHCBKpWrao9nlKIp83UqVP5/fffTW5+fhJu3bqFu7s7P/30E1WqVHmibRECJCgQQgghRAmRkpJC\n48aN+e6772jZsuWTbo4QTxWZPiSEEEKIZ97ixYuxt7enU6dOEhAIUQgZKRBCCCGEEKKEk5ECIYQQ\nQgghSjh5T4EQJdjdnuIhhBBCiH+fB50EJCMFQpRwSilZnqJl0qRJT7wNssjn8TQv8pk8XYt8Hk/X\n8jAkKBBCCCGEEKKEk6BACCGEEEKIEk6ePiTuy+XLl7U3kF68eBGDwYC1tTU6nY7IyEiee+7hb09p\n0aIF+/bte6C8y5cvx9/fHxsbm4dux9KlS5k3bx4AJ06cwNnZGYPBQMeOHSldujTly5fn3XfffeDy\ng4KC+PTTT3FycmLChAl89913pKamkpaWpqVJSEhgyJAh/P3331SqVImVK1dia2uLUopRo0axe/du\nlFK0b9+euXPnmpQ/cuRIli5dqpW3detWYmJimDhxYoG26HS6hx5uFI9WeHg4vr6+T7oZ4v+T+26E\nEPDg8/Qft4f6v66EKKbJkyerOXPm3Ffa7Ozsf7g1eXx9fVVUVFSx8uTk5NwzjaOjo7p8+bK2Pnny\n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\n8uXLM2bMGNzd3fnll1+YOnUqXl5euLq68vrrr2vlDB48mA0bNty1/WvXriUwMFBb9/Lyonr16gXS\nncar8Z0AACAASURBVDp1SgswfH19Tb4r+davX0/nzp0pXbo0kHdO33//fWbOnGlynnQ6HT4+PoSG\nht61bUKIwihZSvQiRAmhnnHly5dXR48eVb169VI3b95U7u7uKjw8XHXp0kUppdTw4cPVRx99pJRS\nKiwsTLm7uyullJo0aZJq0aKFyszMVH///beqXLmyys7OVvHx8crFxUUrf+/evap79+5K/T/27jwu\nqup//PhrGNcUlwwLl3BLUGGGGRACAYfc18xcUkxBs7S0stTUFrH9W2pqtvoxMcOdUMuPZYmgYsY2\ngOYWCpS74gqCCtzfH/y4H8YZBJc0nffz8biPx9x7z3avMnPf95xzr6IoZ8+eVZo3b64UFRVZtCEz\nM1PNk5eXp7Rv31756aefys0bERGhjB8/Xs0/ffp0xd/f36otSUlJioeHh3Lx4kUlNzdXadeunWI2\nm5XMzEylSpUqSlpamqIoijJo0CDlu+++szo3Z86cUT8vWLBAefXVV6957KX15efnK+fPn1datWql\nzJo1y6rc0NBQJSoqSl03mUzKxIkTFUVRlP/+979K586dFUVRlK+++kp59913FUVRlIKCAsXb21vJ\nzMy0Kk+r1Sqenp7q8vDDD6vnp3fv3sq3336rKIqifPPNN+r5DA8PV9sWHByspKamKoqiKFOnTlXm\nz59vUf65c+eU+vXrW9VblkajUVatWqWunz59Wv389NNPKz/88IPVsZtMJiU5OdmqrO7du9vcXrt2\nbYv1oUOHKnPnzlUURVGioqIUjUZjUW/psa1fv15dnzNnjjJnzhyb5X3zzTfK5MmTLbbZwVeAEDcF\nUECRxa4X7vR/QyEq7Wb+v9pFT4GHhwdZWVksW7aMXr16WeyLj49X5xwEBweTk5PDhQsX0Gg09OrV\ni6pVq9KgQQMaNmzI8ePHKTnf/xMUFMSff/7JqVOnWLZsGQMGDMDBwfq0lvYuBAQE0Lt3b7p161Zu\nXkVRLOrRaDT07t3boi3Hjh1j27Zt9O/fn5o1a1KrVi369+/P1q1b0Wg0NG/eHJ1OB4CXlxdZWVlW\nbfr777/p2rUrOp2OmTNnqkN+bB37sWPH2Lp1K/3796dGjRo4OjrSt29fq/NR6urt/fv3B8BoNKpt\n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\nJCgQf2tBQUGcP38eR0dHRo0aRXx8PABjx46lQYMGxMXFsXXrVqDg6npCQgLJycls376dw4cPAwXD\n/3Xq1CExMZF+/foZ1d+hQwclCDhz5gxvvPEGBw4cAAqCgvbt21OvXj02b95MYmIikZGRjB07Vimv\n1+uJiIjg+PHjbNy4kYYNG3Lw4EEOHTpEly5diuzPrl278PLyKnW/NRoNq1evBmD//v2kpaVx4cIF\nozyRkZEMHDiwSNkdO3ZQv359mjdvrqS1bdtWOXZCCCGEEI+q9Fd3QIjHqVq1KomJiezYsYNt27YR\nHBzMv//9bwYPHlwkb1RUFPPnzyc3N5dLly5x9OhRXFxcgIL59sVp3749X331FampqTRp0oQqVapg\nMBi4ffs2SUlJeHt7c//+fUaPHk1ycjJqtZpTp04p5du2batc6XdzcyMsLIyJEyfSvXt3fH19i7SX\nlpaGra1tqfs9ceJE3nvvPbRaLa6urmi1WtRqtbL9/v37rFu3jv/85z9Fyi5fvrxIsGBra0tqamqx\nbT08qqLT6ZSpTUIIIYT4e4uLi1PuU3xWEhSIvz0zMzP8/f3x9/fH1dWVxYsXFwkKzp49y4wZMzhw\n4AA1atRgyJAh3L17V9letWrVYut2cHDg5s2brFu3jvbt2wPg6enJggULaNq0KVZWVoSHh2Nra8vS\npUvJy8vDwsKi2HpbtGiBXq9nw4YNTJ48mcDAQD755JMibT58X0NJrK2tWbBggbLetGlTmjVrpqxv\n3LgRT09P6tata1QuNzeXmJgYkpKSjNINBkOJN/89HBQIIYQQ4sXx6MW8KVOmPHVdMn1I/K2dPHnS\n6Mq8Xq+nSZMmQMGJc1ZWFgBZWVlUrVqV6tWrc/nyZTZu3FjmNnx8fJg1axbt2rUDoF27dnzzzTd0\n6NBBqfull14CYMmSJeTl5RVbz6VLl7CwsGDQoEGEhYUVOTEHsLe3Jz09vdjyBsP/f4NeZmYm9+/f\nB2D+/Pn4+/tTrVo1Zfvy5cuN7hkotGXLFlq1akWDBg2K9K24exeEEEIIIUCCAvE3l52dTUhICM7O\nzmg0Go4fP65c2X777bfp0qULgYGByuNKnZycGDRoULFTd0rSoUMHLly4oMz19/Hx4ezZs8rIwciR\nI1m8eDHu7u6cOHHC6OT84avvhw4dwtvbG61Wy+eff17sKIGvr69yzwJAREQEjRo14uLFi7i5ufH2\n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\nESi+Cn771LFjx4fWwNISEhIwGAz06dMHFxcXBg4cqC376aefcHFxwcfHx+iksPSV3NWrVxMQEIC3\ntzddunTh0qVLQPHV7MGDBxMSEkLLli357LPPtPV79+6Nr68vbm5uzJ8/v9I2Ll68GA8PD9zd3Zkw\nYYKWXq9ePd577z28vLwIDAzU6k5PT+f555/Hz88PPz8/EhMTAdiyZQt6vR69Xo+3tzfZ2dll6iqv\nbeXVderUKQIDA/Hw8OC9994z2f4JEyZw4sQJ9Ho948aNQ6fTkZ2dbXKfJyUlYTAY8PX1pVu3bly4\ncKHS/VNR2wsLC4mOjsbd3R0PDw8+/fRTVqxYwZ49exgwYADe3t7cvHnTqJx//etfzJ49W+v1qF+/\nPi+99BIADg4OTJgwAR8fH5YvX05ISIjWo5ORkUGLFi0AOHToEP7+/uj1ejw9PTlx4kSF+3fBggU4\nOTnh7++vfV9Q/ndZ2q1bt9ixYwdt27YFoHHjxvj6+mJhYWGU78iRI/j7+1O7dm3Mzc3p2LEj33//\nPQC2trZcu3YNgKtXr/Lkk08CkJKSQkhIiFaulZWV1ovQs2dPlixZUuXvRwghhBDVjCrHk08+qaZP\nn66mTZtWZpo+fXp5qz0Q9erVU0optXnzZtWwYUN17tw5VVRUpAIDA9W2bdtUbm6uat68uTp+/LhS\nSqmoqCgVERGhlFJqwYIFauTIkUoppa5cuaKVOX/+fPXWW28ppZSaNGmSCgoKUnl5eSojI0PZ2Nio\ngoICpZRSly9fVkopdePGDeXm5qYyMzPLtM9gMKikpCR17tw59dRTT6mMjAxVUFCgQkND1apVq5RS\nSul0OvXjjz8qpZQaN26cmjJlilJKqX79+qmtW7cqpZRKS0tTLi4uSimlIiIiVGJiolJKqZycHK09\npd3etpL58uqKiIhQCxcuVEop9fnnn2v7tbTU1FTl5uamzZva51u3blV5eXkqMDBQZWRkKKWUWrJk\niRo8eHCZ8mJiYtS0adMqbXtmZqbas2eP6tKli5bn2rVrRvv3dteuXVPW1tZl0ks4ODioqVOnavOl\ny0lPT1cODg5KKaVGjhypFi1apJRSKj8/X+Xm5pps4+XLl9Uff/yhfcd5eXkqKChIjRo1SilV/ndZ\n2vbt21V4eHil+yklJUW1bt1aZWZmqpycHBUQEKBef/11pVTxd2RnZ6eaN2+unnzySXX69GmllFLz\n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\nJiGEEEIInbrbcRlCPOYiIyN57bXX6Nat230tNyYmBhcXF/r27Xtfy63IunXrWLNmjdG7C6A4cJGf\nACHKJ8eIEOJRci+/WdJTIIQJHh4emJubExYWdt/LHjFiBHFxcfe93Ip8+eWXjB49+qHWKcTjYNKk\nSX92E4QQ4qGQngIhqjG5CiqEEEI8PqSnQAghhBBCCHHXJCgQQgghhBCimpOgQAghhBBCiGpOggIh\nhBBCCCGqOQkKhBBCCCGEqOYkKBBCCCGEEKKak6DgL8Tc3By9Xq9NH330kdHyDz74QFtWOu+sWbNM\nlrd//37Wrl2rzcfExDB9+vS7bp/BYMDZ2VmrNyoqqsL8cXFxnD9//q7ri4yMRK/X06pVK6ysrLR6\nd+zYcddlVkVaWhqLFy8ud/kff/xBnz59KiwjNTUVd3d3k8suXbpEjx49AMjMzCQkJIT69eszatQo\no3xLly7F09MTNzc3JkyYoKUfP36cDh06oNfr8fT01L7jffv20a5dO9zc3PD09GTZsmXaOlFRUZw6\ndariDRdCaG9CLz0JIUS1oMRfRr169e5r3gULFqiRI0dq8zExMWratGl31TallDIYDCopKemO8u/Z\ns8fkssLCwiqXk5CQoMLDw6ucPz8/v8L5ymzevLnc+qpa1qlTp5Sbm5vJZX//+9/VsmXLlFJK5eTk\nqK1bt6o5c+YYfVcZGRnqqaeeUhkZGUoppQYNGqQ2btyofZ4zZ45SSqnDhw8rBwcHpZRSv//+uzp+\n/LhSSqk//vhD2draqmvXrimllFq3bp0aNWpUmbbIT4AQxgAFqtQkx4gQ4tFxL79Z0lPwmMrLy+Mf\n//gHS5cuRa/Xa1eNDx8+TEhICC1btuSzzz7T8n/77bf4+/uj1+sZOnQoRUVFJstVJl6I8eyzz7Jw\n4UIA5s6dy8CBA1mxYgV79uxhwIABeHt7c/PmTRwcHJgwYQI+Pj4sX76cL7/8Ej8/P7y8vHj++efJ\nzc2ttM709HSef/55/Pz88PPzIzExESjuBXnxxRdp3749L730EpMnT9bmBw0aREZGhsn1tmzZovVA\n+Pj4kJ2dzYQJE/j111/R6/V8+umnxMXF0bNnTzp16kSXLl1IS0vDzc0NKO4RCA4OxsfHBx8fH7Zv\n317pdxMfH6/1FFhaWhIUFEStWrWM8pw8eZJWrVphY2MDQKdOnVixYgUAtra2XLt2DYCrV6/y5JNP\n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\n9jcMBgNt2rQhLS0NyO2VGD58ON7e3jRs2LDQHor4+Hjc3Nw4ceIE69evp3nz5ri5ueHv7096enqB\n9KmpqbRq1QqTyYTJZNKORUxMDD4+PvTo0YPGjRvTt29fLc/PP/9M48aNMZlMhIeHFygzKyuLjz/+\nmBUrVmA0GrWrxwcPHsTX15eGDRsya9YsLf1//vMfmjVrhtFoZODAgQWuFN+6dYtvvvmGWbNmYWVl\nBUD16tXp0aOHluZf//oXrq6ueHp6avtZ1HG8cOECXbt2xdXVFVdXVy1QmzZtmnbFO3/vUZ7MzEza\ntGmDyWTCxcWFn376CYCxY8dy/PhxjEajFjhOnjwZDw8PDAaDdrW9MPc/uKNr1664u7vj7OzMggUL\nzI65yWTC1dUVf39/Tp48ybx585g+fTpGo5Ft27Y98HMzcOBAmjdvzujRo2nUqBGXLl0CcgPhV199\nlcuXL5u1Iy0tjaysLGrUqAHkBgV6vR4LC/OvYnJyMq1atcLCwoLy5cvj4uKi9eDkycjI4Ndff6VL\nly5A7vfA3d1dey/z69y5M8uXLy/yeIm/EiXLU12EEKKEUM9Q/fr11alTp9S8efPU119/rT766CP1\n3//+V23dulW1bNlSKaXUokWL1NChQ5VSSoWFhakpU6YopZQKCgpSa9asUUop5ejoqC5duqSUUqpX\nr14qIiKiQF3BwcHqu+++U4cOHVJvvvmm2rRpkxo9erS6e/eusrGxUXfu3FGdOnVS3333nVJKqYUL\nF6ouXboopZTq16+fCgwMVEopdfDgQfXKK68opZSKjo5WnTp1Utu2bVMmk0mlpaUppZS6evWqVu+C\nBQvU+++/X6A9t27dUnfu3FFKKXXkyBHl7u6ulVm5cmV15swZlZOTozw9PdW2bdvU7du3VZ06ddSx\nY8eUUkoFBgaqgICAAuUuXrxYDRs2TFv/5JNPlJeXl8rKylKXLl1Stra2Kjs7Wx08eFAFBASo7Oxs\npZRSgwYN0vY9z549e5TRaCz4xv1/Op1OO9ajR49WEyZMUEqpIo9jYGCgmjFjhlJKqZycHHX9+nWV\nkJCg9Hq9unXrlsrMzFROTk5q9+7dSimlKlasqJRSKjs7W2VkZCillLp48aJ2/FNTU5Wzs7PWng0b\nNqgBAwYopZS6d++e6tSpk4qNjS3Q7nr16im9Xq9cXV1V8+bNlVJKXblyRXtfnJ2d1ZUrV1R6erqq\n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\nxyZBgRBCCCGEECWcBAVCCCGEEEKUcBIUCCGEEEIIUcJJUCCEEEIIIUQJJ0GBEEIIIYQQJZwEBS+A\niRMn4uzsjMFgwGg0ag+++vLLL7l9+/Zjl/vpp59iNBoxGo1YWlpqf8+ePbvYvKmpqej1+keqz97e\nHhcXF62e7du307FjRzIyMh66jCVLlnDu3LkiX58yZQqNGzfGaDTi4eHB0qVLH6mNeTZv3sz27dsf\nKy/kHtsHadOmDTdu3AAgJCSEGjVqFDiee/bswdPTExcXFzp37qylz8rKIjg4GBcXF1xdXdm8ebOW\nJysriwEDBuDg4EDjxo0JDw8Hcp+c/LjHQjwdeU/DluXFW4QQokRQ4rn222+/KU9PT5WVlaWUUury\n5cvq7NmzSiml7O3t1aVLlx6pvHv37hW6vWLFigW25eTkqJycnELTp6SkKGdn50eq297eXl2+fLnY\ndA+q18fHRyUkJBT62ty5c1X79u3VjRs3lFJKZWRkqCVLljxSG/N88sknasqUKY+VV6nCj2eeTZs2\nqcGDB2vrsbGxateuXQWOp7u7u4qNjVVKKbVw4UL10UcfKaWUmj17tgoJCVFKKZWenq5MJpOW5+OP\nP9bSKaW0z0dGRoZq2rRpgbbIv4A/DqBAyfLCLfIdEUK8OJ7kf5b0FDznzp8/T7Vq1bCysgKgatWq\n1KxZk5kzZ3L27Fl8fX3x8/MDYNCgQTRt2hRnZ2fCwsK0Muzt7Rk7diwmk4nVq1c/sL7U1FQcHBzo\n168fer2etLQ0Jk+ejIeHBwaDwazcPCdOnMDNzY3ExMRi90fd90ANe3t7rly5Umi9QUFB6PV6XFxc\n+PLLL1mzZg0JCQn06dMHNzc37ty5Y1bWZ599xty5c6lYsSIA1tbWvP322wBs2rQJNzc3XFxceOed\nd8jKytLqDwsLw2Qy4eLiwuHDh0lNTWXevHlMnz4do9HI1q1biYiIoHnz5ri5ueHv7096ejoAmZmZ\n2lV7g8HA2rVrCQ0N5fbt2xiNRt56660Cx+D777/n9ddf19ZbtmxJlSpVCqQ7evQoLVu2BHJ7Ftas\nWQNAcnIyvr6+ANjZ2WFjY0NCQgIAixYtIjQ0VCsj72nN1tbW2NracuDAgWLfIyGEEEKUQE8vNhHP\nQmZmpnJ1dVWNGjVSgwcPVps3b9Zeu//K+5UrV5RSSmVnZysfHx+1b98+Ld3kyZMfWE/ele2UlBRl\n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\nAn9/fxwdHXFycmLy5MlPoKbPt3Xr1mFvb0+9evX47rvvCk3zwQcfUK9ePQwGA9HR0Y+5hublbu2x\nYMECDAYDer0eHx8f9u3b9wRqaV6K8zcCsHv3bkqUKMHvv//+GGtnforTHhERERiNRpycnPDz87t7\npkoIYTY+/vhj9d133ymllBo7dqwaPnx4kWknTJigevToodq1a/e4qmeWitMmZ86cUdHR0UoppVJT\nU1X9+vVVbGzsY63n8ywzM1PVqVNHxcfHq5s3byqDwVDg/K5Zs0a1bt1aKaXUrl27lKen55Ooqlko\nTnvs3LlTXb58WSml1J9//int8YgVp01y0/n7+6u2bduqZcuWPYGamofitMelS5eUg4ODOnHihFJK\nqZSUlLvmKyMFQpiR8PBwevXqBUCvXr1YuXJloelOnjzJ2rVreeedd2Qx8iNWnDapVKkSLi4uAFhb\nW9OwYUNOnz79WOv5PIuMjKRu3brUrFkTKysrunXrxqpVq/KlydtOnp6eXL58mbNnzz6J6j73itMe\njRo1wsbGBshpj5MnTz6JqpqN4rQJwJQpU+jUqRMVKlR4ArU0H8Vpj99++42OHTtSrVo1AF5++eW7\n5itBgRBm5OzZs7zyyisAvPLKK0V2aoYMGcK4ceOwsJD/Ih614rZJroSEBKKjo/H09Hwc1TMLp06d\nonr16trnatWqcerUqbumkY7oo1Gc9sjr119/pU2bNo+jamaruH8jq1aton///oDc8vpRKk57HDly\nhIsXL+Lv74+7uzvz5s27a75yS1IhnjOBgYEkJycX2P7111/n+6zT6Qr9T3v16tVUrFgRo9FIRETE\no6qmWXnQNsmVlpZGp06dmDRpEtbW1g+9nuaquJ2X20fNpNPzaNzLed28eTMzZ85kx44dj7BGojht\nMnjwYMaOHYtOp0MpJaPMj1Bx2uPWrVtERUWxceNGrl27RqNGjfDy8qJevXpF7iNBgRDPmQ0bNhT5\n3SuvvEJycjKVKlXizJkzVKxYsUCanTt3Eh4eztq1a7l+/TpXr17lrbfeYu7cuY+y2s+1B20TyPkP\nvmPHjrzxxht06NDhUVXVLFWtWpUTJ05on0+cOKENuReV5uTJk1StWvWx1dGcFKc9APbt28e7777L\nunXrKF++/OOsotkpTpuYTCa6desGwPnz5/nzzz+xsrIiODj4sdbVHBSnPapXr87LL79M6dKlKV26\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "disagreements = pivoted[pivoted.movie_id.isin(most_50.index)]['diff']\n", "disagreements.sort_values().plot(kind='barh', figsize=[9, 15])\n", "plt.title('Male vs. Female Avg. Ratings\\n(Difference > 0 = Favored by Men)')\n", "plt.ylabel('Title')\n", "plt.xlabel('Average Rating Difference');" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Of course men like Terminator more than women. Independence Day though? Really?" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Additional Resources:\n", "\n", "* [pandas documentation](http://pandas.pydata.org/pandas-docs/stable/)\n", "* [Introduction to pandas](http://nbviewer.ipython.org/urls/gist.github.com/fonnesbeck/5850375/raw/c18cfcd9580d382cb6d14e4708aab33a0916ff3e/1.+Introduction+to+Pandas.ipynb) by [Chris Fonnesbeck](https://twitter.com/fonnesbeck)\n", "* [pandas videos from PyCon](http://pyvideo.org/search?models=videos.video&q=pandas)\n", "* [pandas and Python top 10](http://manishamde.github.io/blog/2013/03/07/pandas-and-python-top-10/)\n", "* [pandasql](http://blog.yhathq.com/posts/pandasql-sql-for-pandas-dataframes.html)\n", "* [Practical pandas by Tom Augspurger (one of the pandas developers)](http://tomaugspurger.github.io/categories/pandas.html)\n", " * [Video](https://www.youtube.com/watch?v=otCriSKVV_8) from Tom's pandas tutorial at PyData Seattle 2015" ] } ], "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.11" } }, "nbformat": 4, "nbformat_minor": 0 }