{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "# The usual preamble\n", "import pandas as pd\n", "# Make the graphs a bit prettier, and bigger\n", "pd.set_option('display.mpl_style', 'default') \n", "pd.set_option('display.line_width', 5000) \n", "pd.set_option('display.max_columns', 60) \n", "\n", "figsize(15, 5)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're going to use a new dataset here, to demonstrate how to deal with larger datasets. This is a subset of the of 311 service requests from [NYC Open Data](https://nycopendata.socrata.com/Social-Services/311-Service-Requests-from-2010-to-Present/erm2-nwe9). " ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints = pd.read_csv('../data/311-service-requests.csv')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.1 What's even in it? (the summary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you look at a large dataframe, instead of showing you the contents of the dataframe, it'll show you a *summary*. This includes all the columns, and how many non-null values there are in each column." ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n",
        "<class 'pandas.core.frame.DataFrame'>\n",
        "Int64Index: 111069 entries, 0 to 111068\n",
        "Data columns (total 52 columns):\n",
        "Unique Key                        111069  non-null values\n",
        "Created Date                      111069  non-null values\n",
        "Closed Date                       60270  non-null values\n",
        "Agency                            111069  non-null values\n",
        "Agency Name                       111069  non-null values\n",
        "Complaint Type                    111069  non-null values\n",
        "Descriptor                        111068  non-null values\n",
        "Location Type                     79048  non-null values\n",
        "Incident Zip                      98813  non-null values\n",
        "Incident Address                  84441  non-null values\n",
        "Street Name                       84438  non-null values\n",
        "Cross Street 1                    84728  non-null values\n",
        "Cross Street 2                    84005  non-null values\n",
        "Intersection Street 1             19364  non-null values\n",
        "Intersection Street 2             19366  non-null values\n",
        "Address Type                      102247  non-null values\n",
        "City                              98860  non-null values\n",
        "Landmark                          95  non-null values\n",
        "Facility Type                     110938  non-null values\n",
        "Status                            111069  non-null values\n",
        "Due Date                          39239  non-null values\n",
        "Resolution Action Updated Date    96507  non-null values\n",
        "Community Board                   111069  non-null values\n",
        "Borough                           111069  non-null values\n",
        "X Coordinate (State Plane)        98143  non-null values\n",
        "Y Coordinate (State Plane)        98143  non-null values\n",
        "Park Facility Name                111069  non-null values\n",
        "Park Borough                      111069  non-null values\n",
        "School Name                       111069  non-null values\n",
        "School Number                     111052  non-null values\n",
        "School Region                     110524  non-null values\n",
        "School Code                       110524  non-null values\n",
        "School Phone Number               111069  non-null values\n",
        "School Address                    111069  non-null values\n",
        "School City                       111069  non-null values\n",
        "School State                      111069  non-null values\n",
        "School Zip                        111069  non-null values\n",
        "School Not Found                  38984  non-null values\n",
        "School or Citywide Complaint      0  non-null values\n",
        "Vehicle Type                      99  non-null values\n",
        "Taxi Company Borough              117  non-null values\n",
        "Taxi Pick Up Location             1059  non-null values\n",
        "Bridge Highway Name               185  non-null values\n",
        "Bridge Highway Direction          185  non-null values\n",
        "Road Ramp                         184  non-null values\n",
        "Bridge Highway Segment            223  non-null values\n",
        "Garage Lot Name                   49  non-null values\n",
        "Ferry Direction                   37  non-null values\n",
        "Ferry Terminal Name               336  non-null values\n",
        "Latitude                          98143  non-null values\n",
        "Longitude                         98143  non-null values\n",
        "Location                          98143  non-null values\n",
        "dtypes: float64(5), int64(1), object(46)\n",
        "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "\n", "Int64Index: 111069 entries, 0 to 111068\n", "Data columns (total 52 columns):\n", "Unique Key 111069 non-null values\n", "Created Date 111069 non-null values\n", "Closed Date 60270 non-null values\n", "Agency 111069 non-null values\n", "Agency Name 111069 non-null values\n", "Complaint Type 111069 non-null values\n", "Descriptor 111068 non-null values\n", "Location Type 79048 non-null values\n", "Incident Zip 98813 non-null values\n", "Incident Address 84441 non-null values\n", "Street Name 84438 non-null values\n", "Cross Street 1 84728 non-null values\n", "Cross Street 2 84005 non-null values\n", "Intersection Street 1 19364 non-null values\n", "Intersection Street 2 19366 non-null values\n", "Address Type 102247 non-null values\n", "City 98860 non-null values\n", "Landmark 95 non-null values\n", "Facility Type 110938 non-null values\n", "Status 111069 non-null values\n", "Due Date 39239 non-null values\n", "Resolution Action Updated Date 96507 non-null values\n", "Community Board 111069 non-null values\n", "Borough 111069 non-null values\n", "X Coordinate (State Plane) 98143 non-null values\n", "Y Coordinate (State Plane) 98143 non-null values\n", "Park Facility Name 111069 non-null values\n", "Park Borough 111069 non-null values\n", "School Name 111069 non-null values\n", "School Number 111052 non-null values\n", "School Region 110524 non-null values\n", "School Code 110524 non-null values\n", "School Phone Number 111069 non-null values\n", "School Address 111069 non-null values\n", "School City 111069 non-null values\n", "School State 111069 non-null values\n", "School Zip 111069 non-null values\n", "School Not Found 38984 non-null values\n", "School or Citywide Complaint 0 non-null values\n", "Vehicle Type 99 non-null values\n", "Taxi Company Borough 117 non-null values\n", "Taxi Pick Up Location 1059 non-null values\n", "Bridge Highway Name 185 non-null values\n", "Bridge Highway Direction 185 non-null values\n", "Road Ramp 184 non-null values\n", "Bridge Highway Segment 223 non-null values\n", "Garage Lot Name 49 non-null values\n", "Ferry Direction 37 non-null values\n", "Ferry Terminal Name 336 non-null values\n", "Latitude 98143 non-null values\n", "Longitude 98143 non-null values\n", "Location 98143 non-null values\n", "dtypes: float64(5), int64(1), object(46)" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.2 Selecting columns and rows" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To select a column, we index with the name of the column, like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints['Complaint Type']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "0 Noise - Street/Sidewalk\n", "1 Illegal Parking\n", "2 Noise - Commercial\n", "3 Noise - Vehicle\n", "4 Rodent\n", "5 Noise - Commercial\n", "6 Blocked Driveway\n", "7 Noise - Commercial\n", "8 Noise - Commercial\n", "9 Noise - Commercial\n", "10 Noise - House of Worship\n", "11 Noise - Commercial\n", "12 Illegal Parking\n", "13 Noise - Vehicle\n", "14 Rodent\n", "...\n", "111054 Noise - Street/Sidewalk\n", "111055 Noise - Commercial\n", "111056 Street Sign - Missing\n", "111057 Noise\n", "111058 Noise - Commercial\n", "111059 Noise - Street/Sidewalk\n", "111060 Noise\n", "111061 Noise - Commercial\n", "111062 Water System\n", "111063 Water System\n", "111064 Maintenance or Facility\n", "111065 Illegal Parking\n", "111066 Noise - Street/Sidewalk\n", "111067 Noise - Commercial\n", "111068 Blocked Driveway\n", "Name: Complaint Type, Length: 111069, dtype: object" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get the first 5 rows of a dataframe, we can use a slice: `df[:5]`.\n", "\n", "This is a great way to get a sense for what kind of information is in the dataframe -- take a minute to look at the contents and get a feel for this dataset." ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints[:5]" ], "language": "python", "metadata": {}, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unique KeyCreated DateClosed DateAgencyAgency NameComplaint TypeDescriptorLocation TypeIncident ZipIncident AddressStreet NameCross Street 1Cross Street 2Intersection Street 1Intersection Street 2Address TypeCityLandmarkFacility TypeStatusDue DateResolution Action Updated DateCommunity BoardBoroughX Coordinate (State Plane)Y Coordinate (State Plane)Park Facility NamePark BoroughSchool NameSchool NumberSchool RegionSchool CodeSchool Phone NumberSchool AddressSchool CitySchool StateSchool ZipSchool Not FoundSchool or Citywide ComplaintVehicle TypeTaxi Company BoroughTaxi Pick Up LocationBridge Highway NameBridge Highway DirectionRoad RampBridge Highway SegmentGarage Lot NameFerry DirectionFerry Terminal NameLatitudeLongitudeLocation
0 26589651 10/31/2013 02:08:41 AM NaN NYPD New York City Police Department Noise - Street/Sidewalk Loud Talking Street/Sidewalk 11432 90-03 169 STREET 169 STREET 90 AVENUE 91 AVENUE NaN NaN ADDRESS JAMAICA NaN Precinct Assigned 10/31/2013 10:08:41 AM 10/31/2013 02:35:17 AM 12 QUEENS QUEENS 1042027 197389 Unspecified QUEENS Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified NNaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.708275-73.791604 (40.70827532593202, -73.79160395779721)
1 26593698 10/31/2013 02:01:04 AM NaN NYPD New York City Police Department Illegal Parking Commercial Overnight Parking Street/Sidewalk 11378 58 AVENUE 58 AVENUE 58 PLACE 59 STREET NaN NaN BLOCKFACE MASPETH NaN Precinct Open 10/31/2013 10:01:04 AM NaN 05 QUEENS QUEENS 1009349 201984 Unspecified QUEENS Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified NNaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.721041-73.909453 (40.721040535628305, -73.90945306791765)
2 26594139 10/31/2013 02:00:24 AM 10/31/2013 02:40:32 AM NYPD New York City Police Department Noise - Commercial Loud Music/Party Club/Bar/Restaurant 10032 4060 BROADWAY BROADWAY WEST 171 STREET WEST 172 STREET NaN NaN ADDRESS NEW YORK NaN Precinct Closed 10/31/2013 10:00:24 AM 10/31/2013 02:39:42 AM 12 MANHATTAN MANHATTAN 1001088 246531 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified NNaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.843330-73.939144 (40.84332975466513, -73.93914371913482)
3 26595721 10/31/2013 01:56:23 AM 10/31/2013 02:21:48 AM NYPD New York City Police Department Noise - Vehicle Car/Truck Horn Street/Sidewalk 10023 WEST 72 STREET WEST 72 STREET COLUMBUS AVENUE AMSTERDAM AVENUE NaN NaN BLOCKFACE NEW YORK NaN Precinct Closed 10/31/2013 09:56:23 AM 10/31/2013 02:21:10 AM 07 MANHATTAN MANHATTAN 989730 222727 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified NNaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.778009-73.980213 (40.7780087446372, -73.98021349023975)
4 26590930 10/31/2013 01:53:44 AM NaN DOHMH Department of Health and Mental Hygiene Rodent Condition Attracting Rodents Vacant Lot 10027 WEST 124 STREET WEST 124 STREET LENOX AVENUE ADAM CLAYTON POWELL JR BOULEVARD NaN NaN BLOCKFACE NEW YORK NaN N/A Pending 11/30/2013 01:53:44 AM 10/31/2013 01:59:54 AM 10 MANHATTAN MANHATTAN 998815 233545 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified NNaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.807691-73.947387 (40.80769092704951, -73.94738703491433)
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ " Unique Key Created Date Closed Date Agency Agency Name Complaint Type Descriptor Location Type Incident Zip Incident Address Street Name Cross Street 1 Cross Street 2 Intersection Street 1 Intersection Street 2 Address Type City Landmark Facility Type Status Due Date Resolution Action Updated Date Community Board Borough X Coordinate (State Plane) Y Coordinate (State Plane) Park Facility Name Park Borough School Name School Number School Region School Code School Phone Number School Address School City School State School Zip School Not Found School or Citywide Complaint Vehicle Type Taxi Company Borough Taxi Pick Up Location Bridge Highway Name Bridge Highway Direction Road Ramp Bridge Highway Segment Garage Lot Name Ferry Direction Ferry Terminal Name Latitude Longitude Location\n", "0 26589651 10/31/2013 02:08:41 AM NaN NYPD New York City Police Department Noise - Street/Sidewalk Loud Talking Street/Sidewalk 11432 90-03 169 STREET 169 STREET 90 AVENUE 91 AVENUE NaN NaN ADDRESS JAMAICA NaN Precinct Assigned 10/31/2013 10:08:41 AM 10/31/2013 02:35:17 AM 12 QUEENS QUEENS 1042027 197389 Unspecified QUEENS Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified N NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.708275 -73.791604 (40.70827532593202, -73.79160395779721)\n", "1 26593698 10/31/2013 02:01:04 AM NaN NYPD New York City Police Department Illegal Parking Commercial Overnight Parking Street/Sidewalk 11378 58 AVENUE 58 AVENUE 58 PLACE 59 STREET NaN NaN BLOCKFACE MASPETH NaN Precinct Open 10/31/2013 10:01:04 AM NaN 05 QUEENS QUEENS 1009349 201984 Unspecified QUEENS Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified N NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.721041 -73.909453 (40.721040535628305, -73.90945306791765)\n", "2 26594139 10/31/2013 02:00:24 AM 10/31/2013 02:40:32 AM NYPD New York City Police Department Noise - Commercial Loud Music/Party Club/Bar/Restaurant 10032 4060 BROADWAY BROADWAY WEST 171 STREET WEST 172 STREET NaN NaN ADDRESS NEW YORK NaN Precinct Closed 10/31/2013 10:00:24 AM 10/31/2013 02:39:42 AM 12 MANHATTAN MANHATTAN 1001088 246531 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified N NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.843330 -73.939144 (40.84332975466513, -73.93914371913482)\n", "3 26595721 10/31/2013 01:56:23 AM 10/31/2013 02:21:48 AM NYPD New York City Police Department Noise - Vehicle Car/Truck Horn Street/Sidewalk 10023 WEST 72 STREET WEST 72 STREET COLUMBUS AVENUE AMSTERDAM AVENUE NaN NaN BLOCKFACE NEW YORK NaN Precinct Closed 10/31/2013 09:56:23 AM 10/31/2013 02:21:10 AM 07 MANHATTAN MANHATTAN 989730 222727 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified N NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.778009 -73.980213 (40.7780087446372, -73.98021349023975)\n", "4 26590930 10/31/2013 01:53:44 AM NaN DOHMH Department of Health and Mental Hygiene Rodent Condition Attracting Rodents Vacant Lot 10027 WEST 124 STREET WEST 124 STREET LENOX AVENUE ADAM CLAYTON POWELL JR BOULEVARD NaN NaN BLOCKFACE NEW YORK NaN N/A Pending 11/30/2013 01:53:44 AM 10/31/2013 01:59:54 AM 10 MANHATTAN MANHATTAN 998815 233545 Unspecified MANHATTAN Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified Unspecified N NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40.807691 -73.947387 (40.80769092704951, -73.94738703491433)" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can combine these to get the first 5 rows of a column:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints['Complaint Type'][:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "0 Noise - Street/Sidewalk\n", "1 Illegal Parking\n", "2 Noise - Commercial\n", "3 Noise - Vehicle\n", "4 Rodent\n", "Name: Complaint Type, dtype: object" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "and it doesn't matter which direction we do it in:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints[:5]['Complaint Type']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "0 Noise - Street/Sidewalk\n", "1 Illegal Parking\n", "2 Noise - Commercial\n", "3 Noise - Vehicle\n", "4 Rodent\n", "Name: Complaint Type, dtype: object" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.3 Selecting multiple columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we just want to know the complaint type and the borough, but not the rest of the information? Pandas makes it really easy to select a subset of the columns: just index with list of columns you want." ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints[['Complaint Type', 'Borough']]" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n",
        "<class 'pandas.core.frame.DataFrame'>\n",
        "Int64Index: 111069 entries, 0 to 111068\n",
        "Data columns (total 2 columns):\n",
        "Complaint Type    111069  non-null values\n",
        "Borough           111069  non-null values\n",
        "dtypes: object(2)\n",
        "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "\n", "Int64Index: 111069 entries, 0 to 111068\n", "Data columns (total 2 columns):\n", "Complaint Type 111069 non-null values\n", "Borough 111069 non-null values\n", "dtypes: object(2)" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "That showed us a summary, and then we can look at the first 10 rows:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints[['Complaint Type', 'Borough']][:10]" ], "language": "python", "metadata": {}, "outputs": [ { "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", "
Complaint TypeBorough
0 Noise - Street/Sidewalk QUEENS
1 Illegal Parking QUEENS
2 Noise - Commercial MANHATTAN
3 Noise - Vehicle MANHATTAN
4 Rodent MANHATTAN
5 Noise - Commercial QUEENS
6 Blocked Driveway QUEENS
7 Noise - Commercial QUEENS
8 Noise - Commercial MANHATTAN
9 Noise - Commercial BROOKLYN
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " Complaint Type Borough\n", "0 Noise - Street/Sidewalk QUEENS\n", "1 Illegal Parking QUEENS\n", "2 Noise - Commercial MANHATTAN\n", "3 Noise - Vehicle MANHATTAN\n", "4 Rodent MANHATTAN\n", "5 Noise - Commercial QUEENS\n", "6 Blocked Driveway QUEENS\n", "7 Noise - Commercial QUEENS\n", "8 Noise - Commercial MANHATTAN\n", "9 Noise - Commercial BROOKLYN" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2.4 What's the most common complaint type?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a really easy question to answer! There's a `.value_counts()` method that we can use:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaints['Complaint Type'].value_counts()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "HEATING 14200\n", "GENERAL CONSTRUCTION 7471\n", "Street Light Condition 7117\n", "DOF Literature Request 5797\n", "PLUMBING 5373\n", "PAINT - PLASTER 5149\n", "Blocked Driveway 4590\n", "NONCONST 3998\n", "Street Condition 3473\n", "Illegal Parking 3343\n", "Noise 3321\n", "Traffic Signal Condition 3145\n", "Dirty Conditions 2653\n", "Water System 2636\n", "Noise - Commercial 2578\n", "...\n", "Opinion for the Mayor 2\n", "Window Guard 2\n", "DFTA Literature Request 2\n", "Legal Services Provider Complaint 2\n", "Open Flame Permit 1\n", "Snow 1\n", "Municipal Parking Facility 1\n", "X-Ray Machine/Equipment 1\n", "Stalled Sites 1\n", "DHS Income Savings Requirement 1\n", "Tunnel Condition 1\n", "Highway Sign - Damaged 1\n", "Ferry Permit 1\n", "Trans Fat 1\n", "DWD 1\n", "Length: 165, dtype: int64" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we just wanted the top 10 most common complaints, we can do this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaint_counts = complaints['Complaint Type'].value_counts()\n", "complaint_counts[:10]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "HEATING 14200\n", "GENERAL CONSTRUCTION 7471\n", "Street Light Condition 7117\n", "DOF Literature Request 5797\n", "PLUMBING 5373\n", "PAINT - PLASTER 5149\n", "Blocked Driveway 4590\n", "NONCONST 3998\n", "Street Condition 3473\n", "Illegal Parking 3343\n", "dtype: int64" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "But it gets better! We can plot them!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "complaint_counts[:10].plot(kind='bar')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "