{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Pandas\n", "----------------------------------------------------------------------------\n", "## Goals:\n", "* Learn how to use pandas dataframes\n", "* Plot basic charts using dataframes and matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reference: \n", "* https://pandas.pydata.org/pandas-docs/stable/getting_started/overview.html\n", "* https://pandas.pydata.org/pandas-docs/stable/reference/frame.html\n", "* https://pandas.pydata.org/pandas-docs/stable/reference/series.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive.It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import pandas library" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas is well suited for many different kinds of data:\n", "* Tabular data with heterogeneously-typed columns, as in an SQL table or Excel spreadsheet\n", "* Ordered and unordered (not necessarily fixed-frequency) time series data.\n", "* Arbitrary matrix data (homogeneously typed or heterogeneous) with row and column labels\n", "* Any other form of observational / statistical data sets. The data actually need not be labeled at all to be placed into a pandas data structure\n", "\n", "Data structures in pandas are:\n", "\n", "* Series objects: 1D array, similar to a column in a spreadsheet\n", "* DataFrame objects: 2D table, similar to a spreadsheet\n", "* Panel objects: Dictionary of DataFrames, similar to sheet in MS Excel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a Serie\n", "A 1D array similar to a column in spreadsheet" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 a\n", "1 b\n", "2 c\n", "3 d\n", "dtype: object\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "ndarray = np.array(['a','b','c','d'])\n", "serie = pd.Series(ndarray)\n", "print(serie)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a data frame\n", "A dataframe is the tabular representation of data. Think of a dataframe as a spreadsheet with column headers and rows." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "dog_data=[\n", " ['Pedro','Doberman',3],\\\n", " ['Clementine','Golden Retriever',8],\\\n", " ['Norah','Great Dane',6],\\\n", " ['Mabel','Austrailian Shepherd',1],\\\n", " ['Bear','Maltese',4],\\\n", " ['Bill','Great Dane',10]\n", "]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "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", "
namebreedage
0PedroDoberman3
1ClementineGolden Retriever8
2NorahGreat Dane6
3MabelAustrailian Shepherd1
4BearMaltese4
5BillGreat Dane10
\n", "
" ], "text/plain": [ " name breed age\n", "0 Pedro Doberman 3\n", "1 Clementine Golden Retriever 8\n", "2 Norah Great Dane 6\n", "3 Mabel Austrailian Shepherd 1\n", "4 Bear Maltese 4\n", "5 Bill Great Dane 10" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df=pd.DataFrame(dog_data,columns=['name','breed','age'])\n", "dog_df" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(type(dog_df['age'].iloc[0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Previewing the data frame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.head(n=5)**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.head.html#pandas.DataFrame.head)\n", "* This function returns the first n rows for the object based on position. It is useful for quickly testing if your object has the right type of data in it" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "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", "
namebreedage
0PedroDoberman3
1ClementineGolden Retriever8
2NorahGreat Dane6
3MabelAustrailian Shepherd1
4BearMaltese4
\n", "
" ], "text/plain": [ " name breed age\n", "0 Pedro Doberman 3\n", "1 Clementine Golden Retriever 8\n", "2 Norah Great Dane 6\n", "3 Mabel Austrailian Shepherd 1\n", "4 Bear Maltese 4" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.tail(n=5)**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.tail.html#pandas.DataFrame.tail)\n", "* This function returns last n rows from the object based on position. It is useful for quickly verifying data, for example, after sorting or appending rows" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "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", "
namebreedage
3MabelAustrailian Shepherd1
4BearMaltese4
5BillGreat Dane10
\n", "
" ], "text/plain": [ " name breed age\n", "3 Mabel Austrailian Shepherd 1\n", "4 Bear Maltese 4\n", "5 Bill Great Dane 10" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.shape**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shape.html#pandas.DataFrame.shape)\n", "* Return a tuple representing the dimensionality of the DataFrame." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6, 3)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.shape" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dog_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.columns**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.columns.html#pandas.DataFrame.columns)\n", "* The column labels of the DataFrame" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['name', 'breed', 'age'], dtype='object')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.dtypes**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dtypes.html#pandas.DataFrame.dtypes)\n", "* Return the dtypes in the DataFrame.\n", "* This returns a Series with the data type of each column.\n", "* The result’s index is the original DataFrame’s columns.\n", "* Columns with mixed types are stored with the object dtype." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name object\n", "breed object\n", "age int64\n", "dtype: object" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.values**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.values.html#pandas.DataFrame.values)\n", "* Return a Numpy representation of the DataFrame.\n", "* Python documentation recommends using DataFrame.to_numpy() instead.\n", "* Only the values in the DataFrame will be returned, the axes labels will be removed." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([['Pedro', 'Doberman', 3],\n", " ['Clementine', 'Golden Retriever', 8],\n", " ['Norah', 'Great Dane', 6],\n", " ['Mabel', 'Austrailian Shepherd', 1],\n", " ['Bear', 'Maltese', 4],\n", " ['Bill', 'Great Dane', 10]], dtype=object)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.describe(percentiles=None, include=None, exclude=None)**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html#pandas.DataFrame.describe)\n", "* Generate descriptive statistics that summarize the central tendency, dispersion and shape of a dataset’s distribution, excluding NaN values.\n", "* Analyzes both numeric and object series, as well as DataFrame column sets of mixed data types. The output will vary depending on what is provided." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "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", "
age
count6.000000
mean5.333333
std3.326660
min1.000000
25%3.250000
50%5.000000
75%7.500000
max10.000000
\n", "
" ], "text/plain": [ " age\n", "count 6.000000\n", "mean 5.333333\n", "std 3.326660\n", "min 1.000000\n", "25% 3.250000\n", "50% 5.000000\n", "75% 7.500000\n", "max 10.000000" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html)\n", "* Return a Series containing counts of unique values.\n", "* The resulting object will be in descending order so that the first element is the most frequently-occurring element. Excludes NA values by default." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Great Dane 2\n", "Golden Retriever 1\n", "Maltese 1\n", "Doberman 1\n", "Austrailian Shepherd 1\n", "Name: breed, dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df['breed'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selecting/Querying" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "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", "
nameage
0Pedro3
1Clementine8
2Norah6
3Mabel1
4Bear4
5Bill10
\n", "
" ], "text/plain": [ " name age\n", "0 Pedro 3\n", "1 Clementine 8\n", "2 Norah 6\n", "3 Mabel 1\n", "4 Bear 4\n", "5 Bill 10" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[['name','age']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.iloc**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html#pandas.DataFrame.iloc)\n", "* Purely integer-location based indexing for selection by position.\n", "* .iloc[] is primarily integer position based (from 0 to length-1 of the axis), but may also be used with a boolean array.\n", "\n", "Allowed inputs are:\n", "\n", "* An integer, e.g. 5.\n", "* A list or array of integers, e.g. [4, 3, 0].\n", "* A slice object with ints, e.g. 1:7.\n", "* A boolean array.\n", "* A callable function with one argument (the calling Series, DataFrame or Panel) and that returns valid output for indexing (one of the above). This is useful in method chains, when you don’t have a reference to the calling object, but would like to base your selection on some value." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "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", "
namebreedage
2NorahGreat Dane6
3MabelAustrailian Shepherd1
\n", "
" ], "text/plain": [ " name breed age\n", "2 Norah Great Dane 6\n", "3 Mabel Austrailian Shepherd 1" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.iloc[2:4]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "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", "
namebreed
1ClementineGolden Retriever
2NorahGreat Dane
3MabelAustrailian Shepherd
\n", "
" ], "text/plain": [ " name breed\n", "1 Clementine Golden Retriever\n", "2 Norah Great Dane\n", "3 Mabel Austrailian Shepherd" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df.iloc[1:4, 0:2]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "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", "
namebreedage
2NorahGreat Dane6
4BearMaltese4
5BillGreat Dane10
\n", "
" ], "text/plain": [ " name breed age\n", "2 Norah Great Dane 6\n", "4 Bear Maltese 4\n", "5 Bill Great Dane 10" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[dog_df['breed'].isin(['Great Dane', 'Maltese'])]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namebreedage
2NorahGreat Dane6
\n", "
" ], "text/plain": [ " name breed age\n", "2 Norah Great Dane 6" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[dog_df['name']=='Norah']" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namebreedage
5BillGreat Dane10
\n", "
" ], "text/plain": [ " name breed age\n", "5 Bill Great Dane 10" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[(dog_df['name']=='Bill') & (dog_df['breed']=='Great Dane')]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "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", "
namebreedage
0PedroDoberman3
3MabelAustrailian Shepherd1
4BearMaltese4
\n", "
" ], "text/plain": [ " name breed age\n", "0 Pedro Doberman 3\n", "3 Mabel Austrailian Shepherd 1\n", "4 Bear Maltese 4" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[dog_df['age']<5]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "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", "
namebreedage
1ClementineGolden Retriever8
2NorahGreat Dane6
5BillGreat Dane10
\n", "
" ], "text/plain": [ " name breed age\n", "1 Clementine Golden Retriever 8\n", "2 Norah Great Dane 6\n", "5 Bill Great Dane 10" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dog_df[dog_df['breed'].str.contains('G')]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Combining data frames" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "owner_data=[['Bilbo','Pedro'],['Gandalf','Bear'],['Sam','Bill']]\n", "owner_df=pd.DataFrame(owner_data,columns=['owner_name','dog_name'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**[DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html#pandas.DataFrame.merge)**\n", "* Merge DataFrame or named Series objects with a database-style join.\n", "* The join is done on columns or indexes. If joining columns on columns, the DataFrame indexes will be ignored. Otherwise if joining indexes on indexes or indexes on a column or columns, the index will be passed on" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "df=pd.merge(owner_df,dog_df,left_on='dog_name',right_on='name',how='inner')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "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", "
owner_namedog_namenamebreedage
0BilboPedroPedroDoberman3
1GandalfBearBearMaltese4
2SamBillBillGreat Dane10
\n", "
" ], "text/plain": [ " owner_name dog_name name breed age\n", "0 Bilbo Pedro Pedro Doberman 3\n", "1 Gandalf Bear Bear Maltese 4\n", "2 Sam Bill Bill Great Dane 10" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More details on merge parameters:\n", "* **right** : DataFrame\n", "* **how** : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’\n", " * left: use only keys from left frame, similar to a SQL left outer join; preserve key order\n", " * right: use only keys from right frame, similar to a SQL right outer join; preserve key order\n", " * outer: use union of keys from both frames, similar to a SQL full outer join; sort keys lexicographically\n", " * inner: use intersection of keys from both frames, similar to a SQL inner join; preserve the order of the left keys\n", "* **on** : label or list. Column or index level names to join on. These must be found in both DataFrames. If on is None and not merging on indexes then this defaults to the intersection of the columns in both DataFrames.\n", "* **left_on** : label or list, or array-like. Column or index level names to join on in the left DataFrame. Can also be an array or list of arrays of the length of the left DataFrame. These arrays are treated as if they are columns.\n", "* **right_on** : label or list, or array-like Column or index level names to join on in the right DataFrame. Can also be an array or list of arrays of the length of the right DataFrame. These arrays are treated as if they are columns.\n", "\n", "Reference: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Merge method | SQL Join Name | Description |\n", "| -------------|---------------|-------------|\n", "| left | LEFT OUTER JOIN | Use keys from left frame only | \n", "| right | RIGHT OUTER JOIN | Use keys from right frame only |\n", "| outer | FULL OUTER JOIN | Use union of keys from both frames |\n", "| inner | INNER JOIN | Use intersection of keys from both frames |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inner Merge" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "inner_df = owner_df.merge(dog_df, left_on='dog_name', right_on='name', how='inner')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "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", "
owner_namedog_namenamebreedage
0BilboPedroPedroDoberman3
1GandalfBearBearMaltese4
2SamBillBillGreat Dane10
\n", "
" ], "text/plain": [ " owner_name dog_name name breed age\n", "0 Bilbo Pedro Pedro Doberman 3\n", "1 Gandalf Bear Bear Maltese 4\n", "2 Sam Bill Bill Great Dane 10" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inner_df" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "inner_df=inner_df.drop(['name'],axis=1)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "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", "
owner_namedog_namebreedage
0BilboPedroDoberman3
1GandalfBearMaltese4
2SamBillGreat Dane10
\n", "
" ], "text/plain": [ " owner_name dog_name breed age\n", "0 Bilbo Pedro Doberman 3\n", "1 Gandalf Bear Maltese 4\n", "2 Sam Bill Great Dane 10" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inner_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Left Merge" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "left_df = owner_df.merge(dog_df, left_on='dog_name', right_on='name', how='left')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "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", "
owner_namedog_namenamebreedage
0BilboPedroPedroDoberman3
1GandalfBearBearMaltese4
2SamBillBillGreat Dane10
\n", "
" ], "text/plain": [ " owner_name dog_name name breed age\n", "0 Bilbo Pedro Pedro Doberman 3\n", "1 Gandalf Bear Bear Maltese 4\n", "2 Sam Bill Bill Great Dane 10" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Right Merge" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "right_df = owner_df.merge(dog_df, left_on='dog_name', right_on='name', how='right')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "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", "
owner_namedog_namenamebreedage
0BilboPedroPedroDoberman3
1GandalfBearBearMaltese4
2SamBillBillGreat Dane10
3NaNNaNClementineGolden Retriever8
4NaNNaNNorahGreat Dane6
5NaNNaNMabelAustrailian Shepherd1
\n", "
" ], "text/plain": [ " owner_name dog_name name breed age\n", "0 Bilbo Pedro Pedro Doberman 3\n", "1 Gandalf Bear Bear Maltese 4\n", "2 Sam Bill Bill Great Dane 10\n", "3 NaN NaN Clementine Golden Retriever 8\n", "4 NaN NaN Norah Great Dane 6\n", "5 NaN NaN Mabel Austrailian Shepherd 1" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Outer Merge" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "outer_df = owner_df.merge(dog_df, left_on='dog_name', right_on='name', how='outer')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "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", "
owner_namedog_namenamebreedage
0BilboPedroPedroDoberman3
1GandalfBearBearMaltese4
2SamBillBillGreat Dane10
3NaNNaNClementineGolden Retriever8
4NaNNaNNorahGreat Dane6
5NaNNaNMabelAustrailian Shepherd1
\n", "
" ], "text/plain": [ " owner_name dog_name name breed age\n", "0 Bilbo Pedro Pedro Doberman 3\n", "1 Gandalf Bear Bear Maltese 4\n", "2 Sam Bill Bill Great Dane 10\n", "3 NaN NaN Clementine Golden Retriever 8\n", "4 NaN NaN Norah Great Dane 6\n", "5 NaN NaN Mabel Austrailian Shepherd 1" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "outer_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dropping Columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')**](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html#pandas.DataFrame.drop)\n", "* Drop specified labels from rows or columns.\n", "* Remove rows or columns by specifying label names and corresponding axis, or by specifying directly index or column names. \n", "* When using a multi-index, labels on different levels can be removed by specifying the level." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "df=df.drop(['name'],axis=1)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "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", "
owner_namedog_namebreedage
0BilboPedroDoberman3
1GandalfBearMaltese4
2SamBillGreat Dane10
\n", "
" ], "text/plain": [ " owner_name dog_name breed age\n", "0 Bilbo Pedro Doberman 3\n", "1 Gandalf Bear Maltese 4\n", "2 Sam Bill Great Dane 10" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic plotting" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "import matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. " ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "# Will allow us to embed images in the notebook\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "plot_df = pd.DataFrame({\n", " 'col1': [1, 3, 2, 4],\n", " 'col2': [3, 6, 5, 1],\n", " 'col3': [4, 7, 6, 2],\n", "})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[**matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)**](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html)\n", "* Plot y versus x as lines and/or markers." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_df.plot()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_df.plot(kind='box')" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_df.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }