Skip to content

Instantly share code, notes, and snippets.

@austinlyons
Last active December 25, 2015 11:29
Show Gist options
  • Save austinlyons/6969657 to your computer and use it in GitHub Desktop.
Save austinlyons/6969657 to your computer and use it in GitHub Desktop.
Initial attempt at playing around with Iowa public salaries with pandas. I clean up the data and then answer the question "Which county has the highest female to male ratio of public employees?"
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Iowa Public Salaries"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "Using pandas to play with data"
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Import a dataset"
},
{
"cell_type": "code",
"collapsed": false,
"input": "import json\n# download the dataset from https://github.com/austinlyons/iowa_salaries/\n# then edit this path to reflect the location of the iowa_public_salaries.json file\npath = '/Users/austinlyons/ipython_notebooks/iowa_salaries/salaries.json'\njson_data = open(path)\nrecords = json.load(json_data)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Where did the data come from? \n\n"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "I wrote a web crawler to scrape all the data from http://data.desmoinesregister.com/dmr/dmr-public-records/state_salaries.php \n\nYou can read a tutorial/see the code [explained in this post](http://www.seeaustinhack.com/2013/09/06/obtaining-data-with-python-scrapy/)\n\nLet's see if we loaded the data correctly"
},
{
"cell_type": "code",
"collapsed": false,
"input": "records[0]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": "{u'base_salary': u'$309,986.00',\n u'county': u'JOHNSON',\n u'department': u'UNIVERSITY OF IOWA',\n u'employee': u'LAROIA SANDEEP',\n u'extra_money': u'$2,496.06',\n u'position': u'CLINICAL ASSISTANT PROFESSOR',\n u'salary': u'$308,151.21',\n u'sex': u'M',\n u'year': u'2012'}"
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Cool. It worked. Let's sort the data by salaries. Oh wait, the salaries are strings with dollar signs in them. I'd rather they just be numbers. Let's clean the data up. We'll write a little helper method that isn't dry or beautiful or efficient (but it works for now). "
},
{
"cell_type": "code",
"collapsed": false,
"input": "def _clean(salary): \n \"\"\" Transform the string '$55,000.00' into the integer 55000 \"\"\"\n # Let's just assume the data could be all sorts of weird\n if isinstance(salary, basestring): # dangerous/bad, yeah i know\n if '$' in salary: \n salary = salary.replace('$', '') \n if ',' in salary: \n salary = salary.replace(',', '') \n if '.' in salary: \n salary = salary.split('.')[0] \n if salary.isdigit(): \n salary = int(salary) \n return salary \n elif salary: \n return salary\n else:\n return 0",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Now we'll clean all of the data"
},
{
"cell_type": "code",
"collapsed": false,
"input": "for r in records:\n r['salary'] = _clean(r['salary'])\n r['base_salary'] = _clean(r['base_salary'])\n r['extra_money'] = _clean(r['extra_money'])",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": "records[0]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": "{u'base_salary': 309986,\n u'county': u'JOHNSON',\n u'department': u'UNIVERSITY OF IOWA',\n u'employee': u'LAROIA SANDEEP',\n u'extra_money': 2496,\n u'position': u'CLINICAL ASSISTANT PROFESSOR',\n u'salary': 308151,\n u'sex': u'M',\n u'year': u'2012'}"
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Time to sort the data - big salaries are interesting!"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from operator import itemgetter\nrecords = sorted(records, key=itemgetter('salary'), reverse=True) \nrecords[0]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": "{u'base_salary': u' ',\n u'county': u'OBRIEN',\n u'department': u'UNIVERSITY OF IOWA',\n u'employee': u'TOWNE ANGELA JO',\n u'extra_money': 36,\n u'position': u'STAFF NURSE',\n u'salary': u'-572',\n u'sex': u'F',\n u'year': u'2008'}"
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": "What the what? Negative salary? I guess students could arguably have negative salaries, but this one says nurse. \nLet's remove negative salaries with our \\_clean helper"
},
{
"cell_type": "code",
"collapsed": false,
"input": "# we could use regular expressions or map(), but\n# for pedagogical purposes it's nice to just use str.replace()\ndef _clean(salary): \n \"\"\" Transform the string '$55,000.00' into the integer 55000 \"\"\"\n # Let's just assume the data could be all sorts of weird\n if isinstance(salary, basestring): # dangerous/bad, yeah i know\n if '$' in salary: \n salary = salary.replace('$', '') \n if ',' in salary: \n salary = salary.replace(',', '') \n if '-' in salary: ## added this check for negative (?) salaries\n salary = \"0\" \n if '.' in salary: \n salary = salary.split('.')[0] \n if salary and salary.isdigit(): \n salary = int(salary) \n return salary \n elif salary > 0: ## updated this line\n return salary\n else:\n return 0",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": "for r in records:\n r['salary'] = _clean(r['salary'])\n r['base_salary'] = _clean(r['base_salary'])\n r['extra_money'] = _clean(r['extra_money'])\n\nrecords = sorted(records, key=itemgetter('salary'), reverse=True) ",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": "records[0]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": "{u'base_salary': 1770000,\n u'county': u'JOHNSON',\n u'department': u'UNIVERSITY OF IOWA',\n u'employee': u'FERENTZ KIRK J',\n u'extra_money': 4005,\n u'position': u'HEAD COACH',\n u'salary': 3862369,\n u'sex': u'M',\n u'year': u'2011'}"
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Highest paid public employee in Iowa? Football coach. It's fairly common:"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<img src='http://img.gawkerassets.com/img/18r80t094bgctpng/ku-bigpic.png'/>"
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Nevada ... LOL"
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "Entries per County with Pandas"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's play around with pandas"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from pandas import DataFrame, Series\nimport pandas as pd; import numpy as np",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[DataFrame](http://pandas.pydata.org/pandas-docs/dev/dsintro.html#dataframe) is a core data structure in pandas. Let's load our data into a pandas DataFrame"
},
{
"cell_type": "code",
"collapsed": false,
"input": "frame = DataFrame(records)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": "frame",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<pre>\n&lt;class 'pandas.core.frame.DataFrame'&gt;\nInt64Index: 443610 entries, 0 to 443609\nData columns (total 9 columns):\nbase_salary 443610 non-null values\ncounty 438826 non-null values\ndepartment 443610 non-null values\nemployee 443610 non-null values\nextra_money 443610 non-null values\nposition 442146 non-null values\nsalary 443610 non-null values\nsex 443317 non-null values\nyear 443610 non-null values\ndtypes: int64(2), object(7)\n</pre>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": "<class 'pandas.core.frame.DataFrame'>\nInt64Index: 443610 entries, 0 to 443609\nData columns (total 9 columns):\nbase_salary 443610 non-null values\ncounty 438826 non-null values\ndepartment 443610 non-null values\nemployee 443610 non-null values\nextra_money 443610 non-null values\nposition 442146 non-null values\nsalary 443610 non-null values\nsex 443317 non-null values\nyear 443610 non-null values\ndtypes: int64(2), object(7)"
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can access a column of a DataFrame with familiar syntax. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "frame['county'][:10]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": "0 JOHNSON\n1 JOHNSON\n2 JOHNSON\n3 JOHNSON\n4 JOHNSON\n5 JOHNSON\n6 JOHNSON\n7 MARION\n8 STORY\n9 JOHNSON\nName: county, dtype: object"
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": "How many entries per county? Use value_counts()."
},
{
"cell_type": "code",
"collapsed": false,
"input": "county_count = frame['county'].value_counts()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": "county_count[:10]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": "JOHNSON 109915\nSTORY 67110\nPOLK 55692\nBLACK HAWK 20742\nLINN 16558\nBOONE 9623\nMARSHALL 8698\nWASHINGTON 8368\nDALLAS 6700\nMILLS 5519\ndtype: int64"
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": "sanity check: county_count should be a list of 99 elements, since Iowa has 99 counties"
},
{
"cell_type": "code",
"collapsed": false,
"input": "print len(county_count)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "952\n"
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": "950+ counties? Huh!? Let's look at the last 30 counties as they'll probably have just one listing each, and maybe we'll get some insight as to what's going on."
},
{
"cell_type": "code",
"collapsed": false,
"input": "print county_count[-30:]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "BOTETOURT 1\nRAPIDES PARISH 1\nELMORE 1\nDIXON 1\nDEBUQUE 1\nSAGINAW 1\nMCKEAN 1\nDAVISON 1\nMUSKINGUM 1\nFOUNTAIN 1\nASCENSION 1\nBINGHAM 1\nCARTER 1\nYAUCO 1\nANTRIM 1\nSANTA BARBA 1\nMENARD 1\nKIMBERLY 1\nNEWPORT NEWS 1\nMEADE 1\nCHARLOTTES 1\nGASTON 1\nJOSEPHINE 1\nMONTROSE 1\nGEAUGA 1\nKOREA 1\nKLICKITAT 1\nROCKLAND 1\nTHROCKMORTON 1\nDAVIESS 1\ndtype: int64\n"
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Uh, yeah, none of these are counties in iowa. Ooh, here are some funny ones."
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "county ... not country"
},
{
"cell_type": "code",
"collapsed": false,
"input": "korea = frame[frame['county'] == 'KOREA']\nCOLUMNS = ['county','employee', 'department', 'position']\nprint korea.loc[:, COLUMNS]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": " county employee department position\n352520 KOREA LEE INAH UNIVERSITY OF IOWA ASSISTANT PROFESSOR\n"
}
],
"prompt_number": 19
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "dubuque... debuque... i haven't had my coffee yet"
},
{
"cell_type": "code",
"collapsed": false,
"input": "debuque = frame[frame['county'] == 'DEBUQUE']\nprint debuque.loc[:,['county', 'employee', 'department']]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": " county employee department\n264773 DEBUQUE LIPPE CAROL ANN UNIVERSITY OF IOWA HOSPITAL & CLINICS\n"
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's remove all of the data with counties that are not in Iowa."
},
{
"cell_type": "code",
"collapsed": false,
"input": "# filter down to only counties in iowa\n# You can make your own list and save it to your local machine by copying/pasting the text from this website: \n# http://www.alphalists.com/list/alphabetical-list-iowa-counties\npath = '/Users/austinlyons/ipython_notebooks/iowa_salaries/iowa_counties.txt'\niowa_counties = [line for line in open(path)]\nassert len(iowa_counties) == 99\nprint iowa_counties[:5]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "['adair\\n', 'adams\\n', 'allamakee\\n', 'appanoose\\n', 'audubon\\n']\n"
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Ooops, there are some newlines in there. Lets clean it up."
},
{
"cell_type": "code",
"collapsed": false,
"input": "iowa_counties = [x.rstrip('\\n') for x in iowa_counties]\nprint iowa_counties[:5]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "['adair', 'adams', 'allamakee', 'appanoose', 'audubon']\n"
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": "All better! Now we can use pandas to find out which rows have a county that is in the list of Iowa counties. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "criterion = frame['county'].map(lambda x: str(x).lower() in iowa_counties)\nprint criterion",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "0 True\n1 True\n2 True\n3 True\n4 True\n5 True\n6 True\n7 True\n8 True\n9 True\n10 True\n11 True\n12 True\n13 True\n14 True\n...\n443595 True\n443596 False\n443597 True\n443598 True\n443599 False\n443600 False\n443601 False\n443602 True\n443603 True\n443604 True\n443605 True\n443606 True\n443607 True\n443608 False\n443609 True\nName: county, Length: 443610, dtype: bool\n"
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": "This looks good - we see True if the row has a county that is actually in Iowa, False otherwise. Let's check a false row to verify. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "print frame.iloc[443608]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "base_salary 1050\ncounty OZAUKEE\ndepartment IOWA STATE UNIVERSITY\nemployee WIECHERT JANET C\nextra_money 0\nposition -0-\nsalary 0\nsex *\nyear 2006\nName: 443608, dtype: object\n"
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": "OZAUKEE is a county in Wisconsin. So far so good."
},
{
"cell_type": "code",
"collapsed": false,
"input": "cleaned_county_frame = frame[criterion]\nprint cleaned_county_frame",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "<class 'pandas.core.frame.DataFrame'>\nInt64Index: 427090 entries, 0 to 443609\nData columns (total 9 columns):\nbase_salary 427090 non-null values\ncounty 427090 non-null values\ndepartment 427090 non-null values\nemployee 427090 non-null values\nextra_money 427090 non-null values\nposition 426030 non-null values\nsalary 427090 non-null values\nsex 426820 non-null values\nyear 427090 non-null values\ndtypes: int64(2), object(7)\n"
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": "cleaned_county_count = cleaned_county_frame['county'].value_counts()\nprint len(cleaned_county_count)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "100\n"
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": "So close! Much better than 952. We can see that the total size of the dataset only decreased from 443610 to 427090. How did we end up with 100 counties though?"
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "JOHNSON!"
},
{
"cell_type": "code",
"collapsed": false,
"input": "print cleaned_county_count.keys()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Index([u'JOHNSON', u'STORY', u'POLK', u'BLACK HAWK', u'LINN', u'BOONE', u'MARSHALL', u'WASHINGTON', u'DALLAS', u'MILLS', u'SCOTT', u'POTTAWATTAMIE', u'WARREN', u'IOWA', u'CEDAR', u'LEE', u'MUSCATINE', u'WOODBURY', u'JASPER', u'HENRY', u'WEBSTER', u'DUBUQUE', u'BUCHANAN', u'PAGE', u'JONES', u'DES MOINES', u'CHEROKEE', u'HARDIN', u'TAMA', u'BENTON', u'CERRO GORDO', u'HAMILTON', u'BREMER', u'MARION', u'KEOKUK', u'CALHOUN', u'CLINTON', u'WAPELLO', u'DELAWARE', u'GRUNDY', u'BUTLER', u'MADISON', u'JACKSON', u'MONTGOMERY', u'FAYETTE', u'JEFFERSON', u'PLYMOUTH', u'CARROLL', u'LOUISA', u'CASS', u'DICKINSON', u'GREENE', u'POWESHIEK', u'CLAY', u'FREMONT', u'BUENA VISTA', u'GUTHRIE', u'MAHASKA', u'WINNESHIEK', u'UNION', u'CLAYTON', u'CHICKASAW', u'LUCAS', u'TAYLOR', u'HARRISON', u'APPANOOSE', u'VAN BUREN', u'CLARKE', u'SAC', u'FRANKLIN', u'FLOYD', u'CRAWFORD', u'ALLAMAKEE', u'SHELBY', u'KOSSUTH', u'SIOUX', u'HUMBOLDT', u'MONROE', u'ADAIR', u'POCAHONTAS', u'WRIGHT', u'DAVIS', u'MONONA', u'HANCOCK', u'DECATUR', u'PALO ALTO', u'WINNEBAGO', u'EMMET', u'WORTH', u'IDA', u'AUDUBON', u'RINGGOLD', u'WAYNE', u'ADAMS', u'HOWARD', u'MITCHELL', u'OSCEOLA', u'LYON', u'Johnson', u'O'BRIEN'], dtype=object)\n"
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": "print cleaned_county_count['Johnson']\nprint cleaned_county_count['JOHNSON']",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "11\n109915\n"
}
],
"prompt_number": 28
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "11,000 >> 11 ... let's just carry on"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Time to give matplotlib a try!"
},
{
"cell_type": "code",
"collapsed": false,
"input": "# make a horizontal bar plot of the top 10 counties by # of public employees\ncleaned_county_count[:10].plot(kind='barh', rot=0)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": "<matplotlib.axes.AxesSubplot at 0x1006b6e10>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x14a9a93d0>"
}
],
"prompt_number": 29
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": "not super interesting. Johnson (U of Iowa), Story (ISU), and Polk (Des Moines/state gov't) round out top 3 counties"
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "let's check out male/female ratio in each county"
},
{
"cell_type": "code",
"collapsed": false,
"input": "male_or_female = cleaned_county_frame['sex'].map(lambda x: str(x).lower() in ['m','f'])\nby_sex_frame = cleaned_county_frame[male_or_female]",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": "pandas [groupby](http://pandas.pydata.org/pandas-docs/dev/groupby.html) is useful"
},
{
"cell_type": "code",
"collapsed": false,
"input": "by_sex = by_sex_frame.groupby(['county', 'sex'])",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": "agg_counts = by_sex.size().unstack()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": "agg_counts[:10]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th>sex</th>\n <th>F</th>\n <th>M</th>\n </tr>\n <tr>\n <th>county</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>ADAIR</th>\n <td> 183</td>\n <td> 296</td>\n </tr>\n <tr>\n <th>ADAMS</th>\n <td> 102</td>\n <td> 144</td>\n </tr>\n <tr>\n <th>ALLAMAKEE</th>\n <td> 191</td>\n <td> 320</td>\n </tr>\n <tr>\n <th>APPANOOSE</th>\n <td> 295</td>\n <td> 319</td>\n </tr>\n <tr>\n <th>AUDUBON</th>\n <td> 126</td>\n <td> 145</td>\n </tr>\n <tr>\n <th>BENTON</th>\n <td> 1283</td>\n <td> 746</td>\n </tr>\n <tr>\n <th>BLACK HAWK</th>\n <td> 11860</td>\n <td> 8881</td>\n </tr>\n <tr>\n <th>BOONE</th>\n <td> 5268</td>\n <td> 4350</td>\n </tr>\n <tr>\n <th>BREMER</th>\n <td> 829</td>\n <td> 816</td>\n </tr>\n <tr>\n <th>BUCHANAN</th>\n <td> 1778</td>\n <td> 1104</td>\n </tr>\n </tbody>\n</table>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 33,
"text": "sex F M\ncounty \nADAIR 183 296\nADAMS 102 144\nALLAMAKEE 191 320\nAPPANOOSE 295 319\nAUDUBON 126 145\nBENTON 1283 746\nBLACK HAWK 11860 8881\nBOONE 5268 4350\nBREMER 829 816\nBUCHANAN 1778 1104"
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": "let's use 2012 data when comparing m/f ratios by county."
},
{
"cell_type": "code",
"collapsed": false,
"input": "frame_2012 = cleaned_county_frame[cleaned_county_frame['year'] == '2012']",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "back to sorting by male/female"
},
{
"cell_type": "code",
"collapsed": false,
"input": "# skip the data where sex is empty or undefined\nmale_or_female = frame_2012['sex'].map(lambda x: str(x).lower() in ['m','f']) \nby_sex_frame = frame_2012[male_or_female]\nby_sex = by_sex_frame.groupby(['county', 'sex'])\nagg_counts_by_sex = by_sex.size().unstack()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can add another column to the data frame very easily."
},
{
"cell_type": "code",
"collapsed": false,
"input": "# add a column called 'Total'\nagg_counts_by_sex['Total'] = agg_counts_by_sex['F'] + agg_counts_by_sex['M']\nagg_counts_by_sex[:10]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th>sex</th>\n <th>F</th>\n <th>M</th>\n <th>Total</th>\n </tr>\n <tr>\n <th>county</th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>ADAIR</th>\n <td> 24</td>\n <td> 38</td>\n <td> 62</td>\n </tr>\n <tr>\n <th>ADAMS</th>\n <td> 16</td>\n <td> 16</td>\n <td> 32</td>\n </tr>\n <tr>\n <th>ALLAMAKEE</th>\n <td> 19</td>\n <td> 43</td>\n <td> 62</td>\n </tr>\n <tr>\n <th>APPANOOSE</th>\n <td> 40</td>\n <td> 38</td>\n <td> 78</td>\n </tr>\n <tr>\n <th>AUDUBON</th>\n <td> 17</td>\n <td> 24</td>\n <td> 41</td>\n </tr>\n <tr>\n <th>BENTON</th>\n <td> 172</td>\n <td> 98</td>\n <td> 270</td>\n </tr>\n <tr>\n <th>BLACK HAWK</th>\n <td> 1528</td>\n <td> 1118</td>\n <td> 2646</td>\n </tr>\n <tr>\n <th>BOONE</th>\n <td> 720</td>\n <td> 604</td>\n <td> 1324</td>\n </tr>\n <tr>\n <th>BREMER</th>\n <td> 109</td>\n <td> 102</td>\n <td> 211</td>\n </tr>\n <tr>\n <th>BUCHANAN</th>\n <td> 235</td>\n <td> 141</td>\n <td> 376</td>\n </tr>\n </tbody>\n</table>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": "sex F M Total\ncounty \nADAIR 24 38 62\nADAMS 16 16 32\nALLAMAKEE 19 43 62\nAPPANOOSE 40 38 78\nAUDUBON 17 24 41\nBENTON 172 98 270\nBLACK HAWK 1528 1118 2646\nBOONE 720 604 1324\nBREMER 109 102 211\nBUCHANAN 235 141 376"
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Of course there will be some cleaning that needs to be done... NaN:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "agg_counts_by_sex.loc[\"O'BRIEN\"]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": "sex\nF 1\nM NaN\nTotal NaN\nName: O'BRIEN, dtype: float64"
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": "agg_counts_by_sex = agg_counts_by_sex.fillna(0)\nagg_counts_by_sex.loc[\"O'BRIEN\"]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": "sex\nF 1\nM 0\nTotal 0\nName: O'BRIEN, dtype: float64"
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Total was NaN because M was NaN... but really M should be 0 and Total should be 1."
},
{
"cell_type": "code",
"collapsed": false,
"input": "agg_counts_by_sex.loc[\"O'BRIEN\"]['Total'] = 1\nagg_counts_by_sex.loc[\"O'BRIEN\"]",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 39,
"text": "sex\nF 1\nM 0\nTotal 1\nName: O'BRIEN, dtype: float64"
}
],
"prompt_number": 39
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Use to sort in ascending order by total # of entries per county\nagg_counts_by_sex = agg_counts_by_sex.sort(columns=['Total'], ascending=False)\nprint agg_counts_by_sex[:10]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "sex F M Total\ncounty \nJOHNSON 8619 6610 15229\nPOLK 4486 3533 8019\nSTORY 3551 4418 7969\nBLACK HAWK 1528 1118 2646\nLINN 1518 896 2414\nBOONE 720 604 1324\nMARSHALL 866 330 1196\nWASHINGTON 783 386 1169\nDALLAS 515 407 922\nMILLS 466 298 764\n"
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": "# plot F and M but not Total\nagg_counts_by_sex[['F','M']][:10].plot(kind='barh', stacked=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 41,
"text": "<matplotlib.axes.AxesSubplot at 0x107cbca10>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAAAAAElFTkSuQmCC\n",
"text": "<matplotlib.figure.Figure at 0x107cbb890>"
}
],
"prompt_number": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Hard to see the ratios for lower counties, let's normalize"
},
{
"cell_type": "code",
"collapsed": false,
"input": "# female:male ratio for top 10 counties (by # of entries)\nnormed_subset = agg_counts_by_sex[['F','M']][:10].div(agg_counts_by_sex[['F','M']][:10].sum(1), axis=0)\nnormed_subset.plot(kind='barh', stacked=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 42,
"text": "<matplotlib.axes.AxesSubplot at 0x107cc3d10>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\npKITQgjh0v4fpdS3Fvk7wwwAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x106a35110>"
}
],
"prompt_number": 42
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "Of all counties in Iowa, which have the higest female to male ratio?"
},
{
"cell_type": "code",
"collapsed": false,
"input": "full_normed = agg_counts_by_sex[['F','M']].div(agg_counts_by_sex[['F','M']].sum(1), axis=0)\nprint full_normed.sort(columns=['F'], ascending=False)[:20]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "sex F M\ncounty \nO'BRIEN 1.000000 0.000000\nMARSHALL 0.724080 0.275920\nIOWA 0.706337 0.293663\nLOUISA 0.695312 0.304688\nMUSCATINE 0.695205 0.304795\nKEOKUK 0.671569 0.328431\nWASHINGTON 0.669803 0.330197\nTAMA 0.664311 0.335689\nCEDAR 0.654822 0.345178\nSCOTT 0.643466 0.356534\nBENTON 0.637037 0.362963\nJohnson 0.636364 0.363636\nLINN 0.628832 0.371168\nBUCHANAN 0.625000 0.375000\nCLAY 0.614035 0.385965\nMILLS 0.609948 0.390052\nUNION 0.602410 0.397590\nPOTTAWATTAMIE 0.600293 0.399707\nWAPELLO 0.596685 0.403315\nCLINTON 0.594737 0.405263\n"
}
],
"prompt_number": 43
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "Let's get F/M ratios with total # of employees all in one glance"
},
{
"cell_type": "code",
"collapsed": false,
"input": "full_normed['Employee Count'] = agg_counts_by_sex['Total']\nprint full_normed.sort(columns=['F'], ascending=False)[:30]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "sex F M Employee Count\ncounty \nO'BRIEN 1.000000 0.000000 1\nMARSHALL 0.724080 0.275920 1196\nIOWA 0.706337 0.293663 647\nLOUISA 0.695312 0.304688 128\nMUSCATINE 0.695205 0.304795 584\nKEOKUK 0.671569 0.328431 204\nWASHINGTON 0.669803 0.330197 1169\nTAMA 0.664311 0.335689 283\nCEDAR 0.654822 0.345178 591\nSCOTT 0.643466 0.356534 704\nBENTON 0.637037 0.362963 270\nJohnson 0.636364 0.363636 11\nLINN 0.628832 0.371168 2414\nBUCHANAN 0.625000 0.375000 376\nCLAY 0.614035 0.385965 114\nMILLS 0.609948 0.390052 764\nUNION 0.602410 0.397590 83\nPOTTAWATTAMIE 0.600293 0.399707 683\nWAPELLO 0.596685 0.403315 181\nCLINTON 0.594737 0.405263 190\nBUTLER 0.591837 0.408163 147\nHOWARD 0.583333 0.416667 36\nIDA 0.578947 0.421053 38\nBLACK HAWK 0.577475 0.422525 2646\nCARROLL 0.576923 0.423077 130\nJOHNSON 0.565960 0.434040 15229\nHAMILTON 0.562992 0.437008 254\nWARREN 0.562205 0.437795 635\nMARION 0.561321 0.438679 212\nPOLK 0.559421 0.440579 8019\n"
}
],
"prompt_number": 44
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment