{ "cells": [ { "cell_type": "markdown", "id": "8e29e3cb", "metadata": {}, "source": [ "
\n", "\n", "# 🐼 Pandas Overview\n", " \n", " πŸ‘¨β€πŸ« **Vikesh K** \n", " πŸ““ **Lab 03**\n", " \n", "
" ] }, { "cell_type": "markdown", "id": "a6cd4fd0", "metadata": {}, "source": [ " πŸ’‘ \n", " **\"All great achievements require time\"**\n", " πŸ’‘ " ] }, { "cell_type": "markdown", "id": "8f37e23c", "metadata": {}, "source": [ " \n", "## πŸ“Lab Agenda\n", "\n", "* Understanding Pandas 101\n", " * Creating Pandas df\n", " * Data manipulation\n", " * Data cleaning\n", " * Data Visualization\n" ] }, { "cell_type": "markdown", "id": "c0ea3744", "metadata": {}, "source": [ "```{tip}\n", "* Use **Ctrl + /** to comment a code\n", "* Press H to see all the shortcuts\n", "```" ] }, { "cell_type": "markdown", "id": "c759ee5a", "metadata": {}, "source": [ "\n", "## Pandas 101\n", "\n", "* 80% of the time you will be using Pandas function if you are working with Tabular data\n", "* It is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool,\n", "built on top of the Python programming language.\n", "* Responsible for making python a popular choice for Data analysis " ] }, { "cell_type": "markdown", "id": "557f2d97", "metadata": {}, "source": [ "## Importing Pandas" ] }, { "cell_type": "code", "execution_count": 125, "id": "059c40d3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.1.0\n", "C:\\Users\\vkoul\\Desktop\\DA_Training_book\\pythonbook\n" ] } ], "source": [ "import pandas as pd # launching the pandas and save it as pd\n", "print(pd.__version__)\n", "\n", "import os # operating system library \n", "print(os.getcwd()) # working directory " ] }, { "cell_type": "markdown", "id": "d775efe5", "metadata": {}, "source": [ "**In case your Pandas is not updated, uncomment and run the code below**" ] }, { "cell_type": "code", "execution_count": 126, "id": "840827bd", "metadata": {}, "outputs": [], "source": [ "# !pip install --upgrade pandas" ] }, { "cell_type": "code", "execution_count": 127, "id": "66ea3651", "metadata": {}, "outputs": [], "source": [ "# !pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org pandas" ] }, { "cell_type": "markdown", "id": "e441547b", "metadata": {}, "source": [ "## Creating Pandas DataFrame\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "de5bb00c", "metadata": {}, "source": [ "![pandas_data_structure](images/pandas_data_structure.jpg)" ] }, { "cell_type": "markdown", "id": "e6086cdf", "metadata": {}, "source": [ "```{note}\n", "**Three ways to create a pandas df:**\n", "\n", "* Dictionary\n", "* List \n", "* External source (csv, excel, database etc)\n", "```" ] }, { "cell_type": "code", "execution_count": 128, "id": "4273375f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## From dictionary \n", "sample_dict = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}\n", "sample_dict" ] }, { "cell_type": "code", "execution_count": 129, "id": "bd1d67ed", "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", "
col_1col_2
03a
12b
21c
30d
\n", "
" ], "text/plain": [ " col_1 col_2\n", "0 3 a\n", "1 2 b\n", "2 1 c\n", "3 0 d" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(sample_dict)" ] }, { "cell_type": "code", "execution_count": 130, "id": "a3de8586", "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", "
UniversityCountry
0ImperialUK
1OxfordUK
\n", "
" ], "text/plain": [ " University Country\n", "0 Imperial UK\n", "1 Oxford UK" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## From List \n", "pd.DataFrame([['Imperial', 'UK'], ['Oxford', 'UK']], columns = [\"University\", \"Country\"])" ] }, { "cell_type": "markdown", "id": "a007df9c", "metadata": {}, "source": [ "**External Source**" ] }, { "cell_type": "code", "execution_count": 131, "id": "ec22a9f2", "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", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C " ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'https://raw.githubusercontent.com/vkoul/data/main/misc/titanic.csv'\n", "\n", "\n", "df = pd.read_csv(url)\n", "df.head(2) # show the first 2 rows of the dataset" ] }, { "cell_type": "markdown", "id": "0bdd0559", "metadata": {}, "source": [ "\n", "## Pandas Attributes and Methods\n", "\n", "In python, **methods** are functions specfic to an object type. The pandas methods allow you to do different operations on the dataset\n", "\n", "Another aspect is **attributes** are like methods, but instead of transforming the variables or data they are used to give you more information about the data that you have. The attributes don't have () at the end. \n", " \n", "Pandas is column oriented, many of the methods are applicable at a column level\n" ] }, { "cell_type": "markdown", "id": "cb7eced2", "metadata": {}, "source": [ "![pandas_methods](images/pandas_methods.png)\n", "\n", "Source: J Ebener" ] }, { "cell_type": "code", "execution_count": 132, "id": "1fd0cf88", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are a total of 141 pandas attributes and methods\n" ] } ], "source": [ "print(\"There are a total of {} pandas attributes and methods\".format(len(dir(pd))))" ] }, { "cell_type": "markdown", "id": "eb31ecec", "metadata": {}, "source": [ "## Useful Attributes\n", "\n", "**Data Frame metadata**\n", "\n", "* `df.shape` - rows and columns in the data \n", "* `df.values` - the values in each of the columns\n", "* `df.index` - this is how pandas identifies each row\n", "* `df.columns` - the columns in the data \n" ] }, { "cell_type": "markdown", "id": "9033cfc7", "metadata": {}, "source": [ "\n", "## Useful Methods\n", "\n", "\n", "**DataFrame Check**\n", "\n", "* `df.info()` - get quick info on the dataset \n", "* `df.head()` - check the initial 5 rows\n", "* `df.tail()` - check the last 5 rows\n", "* `df.dtypes()` - check the data types of the columns\n", "* `df.sample(n)` - randomly select n rows of the data\n", "\n", "\n", "**DataFrame Investigation**\n", "* `df.duplicated().sum()` - count the duplicated values in the data\n", "* `df.isna().sum()` - missing values in a dataframe\n", "* `df.isna().mean()` - percentage of missing values in a dataframe\n", "* `df.describe()` - summary of the numerical columns \n", "* `df.describe(include = \"O\")` - summary of the categorical columns \n", "\n", "**Column wise analysis**\n", "* `df.query()` - select a subset of data based on conditions\n", "* `df.filter()` - select only specified columns\n", "* `df.assign()` - add a new column to the df\n", "* `df.drop()` - drop columns/ rows\n", "* `df.sort_values(by = \"col1\")` - sort dataframe based on values\n", "* `df.value_counts()` - frequency values of a column \n", "\n", "**Summarise** \n", "* `df['col'].mean()` - calculate the average value of the column\n", "* `df['col'].median()` - calculate the median value of the column\n", "* `df['col'].sum()` - sum up of all the values in the column\n", "* `df['col'].product()` - multiply all the values in the column\n", "* `df['col']..agg([\"mean\", \"median\", \"sum\", \"product\"])` - `agg()` is very useful for doing multiple aggregations simultaneously\n", "\n", "**Other operations** \n", "\n", "* `df['col'].astype()` - change the datatype of a column\n", " * `df['col'].astype('int')` - change the datatype to integer\n", " * `df['col'].astype('object')` - change the datatype to integer\n", " " ] }, { "cell_type": "markdown", "id": "84d24ca0", "metadata": {}, "source": [ "\n", "## πŸ““ Case Study - Titanic\n" ] }, { "cell_type": "markdown", "id": "cd8779f8", "metadata": {}, "source": [ "![titanic](images/titanic.jpg)" ] }, { "cell_type": "markdown", "id": "f5a7e733", "metadata": {}, "source": [ "### Importing dataset" ] }, { "cell_type": "code", "execution_count": 133, "id": "c946412f", "metadata": {}, "outputs": [], "source": [ "url = 'https://raw.githubusercontent.com/vkoul/data/main/misc/titanic.csv'\n", "\n", "# reading in the file\n", "df = pd.read_csv(url)" ] }, { "cell_type": "markdown", "id": "08281bc5", "metadata": {}, "source": [ "### Basic data investigation" ] }, { "cell_type": "markdown", "id": "2be441ab", "metadata": {}, "source": [ "**How does data look like?**" ] }, { "cell_type": "code", "execution_count": 134, "id": "3b4bae81", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.frame.DataFrame" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(df)" ] }, { "cell_type": "code", "execution_count": 135, "id": "dfed13cc", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S " ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head() # show 5 rows" ] }, { "cell_type": "code", "execution_count": 136, "id": "270ddd01", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',\n", " 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],\n", " dtype='object')" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 137, "id": "bf6f9320", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=891, step=1)" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "code", "execution_count": 138, "id": "92545c60", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 0, 3, ..., 7.25, nan, 'S'],\n", " [2, 1, 1, ..., 71.2833, 'C85', 'C'],\n", " [3, 1, 3, ..., 7.925, nan, 'S'],\n", " ...,\n", " [889, 0, 3, ..., 23.45, nan, 'S'],\n", " [890, 1, 1, ..., 30.0, 'C148', 'C'],\n", " [891, 0, 3, ..., 7.75, nan, 'Q']], dtype=object)" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values" ] }, { "cell_type": "markdown", "id": "c243dc8a", "metadata": {}, "source": [ "**How many rows and columns?**" ] }, { "cell_type": "code", "execution_count": 139, "id": "844f6a1e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(891, 12)" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "markdown", "id": "f7fa1510", "metadata": {}, "source": [ "**Summary of the data**" ] }, { "cell_type": "code", "execution_count": 140, "id": "dbcc3eb1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 891 entries, 0 to 890\n", "Data columns (total 12 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 PassengerId 891 non-null int64 \n", " 1 Survived 891 non-null int64 \n", " 2 Pclass 891 non-null int64 \n", " 3 Name 891 non-null object \n", " 4 Sex 891 non-null object \n", " 5 Age 714 non-null float64\n", " 6 SibSp 891 non-null int64 \n", " 7 Parch 891 non-null int64 \n", " 8 Ticket 891 non-null object \n", " 9 Fare 891 non-null float64\n", " 10 Cabin 204 non-null object \n", " 11 Embarked 889 non-null object \n", "dtypes: float64(2), int64(5), object(5)\n", "memory usage: 83.7+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "markdown", "id": "3e0877f9", "metadata": {}, "source": [ "### Column select \n", "\n", "**How to select specific columns in the dataframe**" ] }, { "cell_type": "markdown", "id": "8f13d06b", "metadata": {}, "source": [ "```{note} \n", "\n", "There are multiple ways of choosing a particular column in pandas\n", "\n", "The common method is \n", "\n", "`dataframe[\"column_name\"]`\n", "\n", "One can also use \n", "\n", "`df.column_name` \n", "\n", "**If you wish to use the Pandas method**\n", "\n", "`df.filter(column_name)\n", "\n", "In case of multiple columns: \n", "\n", "`dataframe[[\"col1\", \"col2\"]]` \n", " \n", "```" ] }, { "cell_type": "markdown", "id": "79387258", "metadata": {}, "source": [ "**Please select the `Name` column** " ] }, { "cell_type": "code", "execution_count": 141, "id": "c771e9cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Braund, Mr. Owen Harris\n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th...\n", "2 Heikkinen, Miss. Laina\n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel)\n", "4 Allen, Mr. William Henry\n", " ... \n", "886 Montvila, Rev. Juozas\n", "887 Graham, Miss. Margaret Edith\n", "888 Johnston, Miss. Catherine Helen \"Carrie\"\n", "889 Behr, Mr. Karl Howell\n", "890 Dooley, Mr. Patrick\n", "Name: Name, Length: 891, dtype: object" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Name']" ] }, { "cell_type": "markdown", "id": "7c9865e9", "metadata": {}, "source": [ "**Select only `Name`, `Sex` and `Age`**" ] }, { "cell_type": "code", "execution_count": 142, "id": "112c2379", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Name', 'Age', 'Sex']" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "col_list = ['Name', 'Age', 'Sex' ]\n", "col_list" ] }, { "cell_type": "code", "execution_count": 143, "id": "35489e30", "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", "
NameAgeSex
0Braund, Mr. Owen Harris22.0male
1Cumings, Mrs. John Bradley (Florence Briggs Th...38.0female
2Heikkinen, Miss. Laina26.0female
3Futrelle, Mrs. Jacques Heath (Lily May Peel)35.0female
4Allen, Mr. William Henry35.0male
\n", "
" ], "text/plain": [ " Name Age Sex\n", "0 Braund, Mr. Owen Harris 22.0 male\n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... 38.0 female\n", "2 Heikkinen, Miss. Laina 26.0 female\n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) 35.0 female\n", "4 Allen, Mr. William Henry 35.0 male" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[col_list].head()" ] }, { "cell_type": "markdown", "id": "b30c30c3", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": 144, "id": "dfd1de05", "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", "
NameSexAge
0Braund, Mr. Owen Harrismale22.0
1Cumings, Mrs. John Bradley (Florence Briggs Th...female38.0
2Heikkinen, Miss. Lainafemale26.0
\n", "
" ], "text/plain": [ " Name Sex Age\n", "0 Braund, Mr. Owen Harris male 22.0\n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0\n", "2 Heikkinen, Miss. Laina female 26.0" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.filter(col_list).head(3)" ] }, { "cell_type": "markdown", "id": "48a60e5a", "metadata": {}, "source": [ "### Row Filtering\n", "\n", "**The syntax to filter rows based on a condition**\n", "\n", "```py\n", "\n", "df.query('column_name >= condition ') # greater than \n", "\n", "df.query('column_name < condition ') # less than \n", "\n", "df.query('column_name == \"condition\" ') # equal to \n", "\n", "```\n", "\n" ] }, { "cell_type": "markdown", "id": "060205cd", "metadata": {}, "source": [ "**Select only survived passengers**" ] }, { "cell_type": "code", "execution_count": 145, "id": "c65bbfc5", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "\n", " Name Sex Age SibSp \\\n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S " ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query('Survived == 1').head(3)" ] }, { "cell_type": "code", "execution_count": 146, "id": "927f2b4f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(342, 12)" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query('Survived == 1').shape" ] }, { "cell_type": "markdown", "id": "39817651", "metadata": {}, "source": [ "**Select only female passengers**" ] }, { "cell_type": "code", "execution_count": 147, "id": "c28f53ed", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(314, 12)" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query(\"Sex == 'female'\").shape" ] }, { "cell_type": "code", "execution_count": 148, "id": "09b37e20", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(577, 12)" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query(\"Sex == 'male'\").shape" ] }, { "cell_type": "markdown", "id": "0f88a4ed", "metadata": {}, "source": [ "**Mutilple Conditions**" ] }, { "cell_type": "code", "execution_count": 149, "id": "bcd5c65d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(119, 12)" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query('Survived == 1 & Pclass == 3').shape" ] }, { "cell_type": "markdown", "id": "839bb040", "metadata": {}, "source": [ "**How many ladies survived?**" ] }, { "cell_type": "code", "execution_count": 150, "id": "e986bb0a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(233, 12)" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.query('Survived == 1 & Sex == \"female\"').shape" ] }, { "cell_type": "code", "execution_count": 151, "id": "bd6e632d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7420382165605095" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "233/314" ] }, { "cell_type": "markdown", "id": "ff273a59", "metadata": {}, "source": [ "**How many men survived?**" ] }, { "cell_type": "code", "execution_count": 152, "id": "7ef05ab1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(109, 12)" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# πŸ’ͺ Please write the relevant code here\n", "df.query('Survived == 1 & Sex == \"male\"').shape" ] }, { "cell_type": "code", "execution_count": 153, "id": "f2d5d0ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.18890814558058924" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "109/577" ] }, { "cell_type": "markdown", "id": "5e7b3459", "metadata": {}, "source": [ "**Bonus question- Are the character names shown in Titanic movie real?**\n", "\n" ] }, { "cell_type": "markdown", "id": "20054dcf", "metadata": {}, "source": [ "![actors](images/actors.png)" ] }, { "cell_type": "code", "execution_count": 154, "id": "dad5c6ed", "metadata": {}, "outputs": [], "source": [ "# πŸ’ͺ Please write the relevant code here" ] }, { "cell_type": "markdown", "id": "cc5c2f0c", "metadata": {}, "source": [ "### Data sorting" ] }, { "cell_type": "markdown", "id": "d9a13070", "metadata": {}, "source": [ "**Single Column sorting**" ] }, { "cell_type": "code", "execution_count": 155, "id": "c0f06822", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
64464513Baclini, Miss. Eugeniefemale0.7521266619.2583NaNC
46947013Baclini, Miss. Helene Barbarafemale0.7521266619.2583NaNC
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex \\\n", "803 804 1 3 Thomas, Master. Assad Alexander male \n", "755 756 1 2 Hamalainen, Master. Viljo male \n", "644 645 1 3 Baclini, Miss. Eugenie female \n", "469 470 1 3 Baclini, Miss. Helene Barbara female \n", "\n", " Age SibSp Parch Ticket Fare Cabin Embarked \n", "803 0.42 0 1 2625 8.5167 NaN C \n", "755 0.67 1 1 250649 14.5000 NaN S \n", "644 0.75 2 1 2666 19.2583 NaN C \n", "469 0.75 2 1 2666 19.2583 NaN C " ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = 'Age', ascending = True).head(4)" ] }, { "cell_type": "code", "execution_count": 156, "id": "c9d180a7", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
63063111Barkworth, Mr. Algernon Henry Wilsonmale80.0002704230.0000A23S
85185203Svensson, Mr. Johanmale74.0003470607.7750NaNS
49349401Artagaveytia, Mr. Ramonmale71.000PC 1760949.5042NaNC
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name \\\n", "630 631 1 1 Barkworth, Mr. Algernon Henry Wilson \n", "851 852 0 3 Svensson, Mr. Johan \n", "493 494 0 1 Artagaveytia, Mr. Ramon \n", "\n", " Sex Age SibSp Parch Ticket Fare Cabin Embarked \n", "630 male 80.0 0 0 27042 30.0000 A23 S \n", "851 male 74.0 0 0 347060 7.7750 NaN S \n", "493 male 71.0 0 0 PC 17609 49.5042 NaN C " ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = 'Age', ascending = False).head(3)" ] }, { "cell_type": "markdown", "id": "8aa5675c", "metadata": {}, "source": [ "**Sort the data by Fare and check the highest price**" ] }, { "cell_type": "code", "execution_count": 157, "id": "a48e858e", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name \\\n", "258 259 1 1 Ward, Miss. Anna \n", "737 738 1 1 Lesurer, Mr. Gustave J \n", "679 680 1 1 Cardeza, Mr. Thomas Drake Martinez \n", "\n", " Sex Age SibSp Parch Ticket Fare Cabin Embarked \n", "258 female 35.0 0 0 PC 17755 512.3292 NaN C \n", "737 male 35.0 0 0 PC 17755 512.3292 B101 C \n", "679 male 36.0 0 1 PC 17755 512.3292 B51 B53 B55 C " ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = 'Fare', ascending = False).head(3)" ] }, { "cell_type": "code", "execution_count": 158, "id": "2540f421", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
27127213Tornquist, Mr. William Henrymale25.000LINE0.0NaNS
59759803Johnson, Mr. Alfredmale49.000LINE0.0NaNS
30230303Johnson, Mr. William Cahoone Jrmale19.000LINE0.0NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex \\\n", "271 272 1 3 Tornquist, Mr. William Henry male \n", "597 598 0 3 Johnson, Mr. Alfred male \n", "302 303 0 3 Johnson, Mr. William Cahoone Jr male \n", "\n", " Age SibSp Parch Ticket Fare Cabin Embarked \n", "271 25.0 0 0 LINE 0.0 NaN S \n", "597 49.0 0 0 LINE 0.0 NaN S \n", "302 19.0 0 0 LINE 0.0 NaN S " ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = 'Fare', ascending = True).head(3)" ] }, { "cell_type": "markdown", "id": "dea9616c", "metadata": {}, "source": [ "**Multiple Column sorting**" ] }, { "cell_type": "code", "execution_count": 159, "id": "a1562179", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
30230303Johnson, Mr. William Cahoone Jrmale19.000LINE0.0NaNS
27127213Tornquist, Mr. William Henrymale25.000LINE0.0NaNS
17918003Leonard, Mr. Lionelmale36.000LINE0.0NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex \\\n", "302 303 0 3 Johnson, Mr. William Cahoone Jr male \n", "271 272 1 3 Tornquist, Mr. William Henry male \n", "179 180 0 3 Leonard, Mr. Lionel male \n", "\n", " Age SibSp Parch Ticket Fare Cabin Embarked \n", "302 19.0 0 0 LINE 0.0 NaN S \n", "271 25.0 0 0 LINE 0.0 NaN S \n", "179 36.0 0 0 LINE 0.0 NaN S " ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = ['Fare', 'Age']).head(3) # pass the column names in a list" ] }, { "cell_type": "code", "execution_count": 160, "id": "e118f8de", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
46947013Baclini, Miss. Helene Barbarafemale0.7521266619.2583NaNC
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex \\\n", "803 804 1 3 Thomas, Master. Assad Alexander male \n", "755 756 1 2 Hamalainen, Master. Viljo male \n", "469 470 1 3 Baclini, Miss. Helene Barbara female \n", "\n", " Age SibSp Parch Ticket Fare Cabin Embarked \n", "803 0.42 0 1 2625 8.5167 NaN C \n", "755 0.67 1 1 250649 14.5000 NaN S \n", "469 0.75 2 1 2666 19.2583 NaN C " ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = ['Age', 'Fare'], ascending = [True, True]).head(3)" ] }, { "cell_type": "code", "execution_count": 161, "id": "12ca8d30", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
59759803Johnson, Mr. Alfredmale49.000LINE0.0NaNS
26326401Harrison, Mr. Williammale40.0001120590.0B94S
80680701Andrews, Mr. Thomas Jrmale39.0001120500.0A36S
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex Age SibSp \\\n", "597 598 0 3 Johnson, Mr. Alfred male 49.0 0 \n", "263 264 0 1 Harrison, Mr. William male 40.0 0 \n", "806 807 0 1 Andrews, Mr. Thomas Jr male 39.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "597 0 LINE 0.0 NaN S \n", "263 0 112059 0.0 B94 S \n", "806 0 112050 0.0 A36 S " ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by = ['Fare', 'Age'], ascending = [True, False]).head(3)" ] }, { "cell_type": "markdown", "id": "b2e262da", "metadata": {}, "source": [ "### New column creation" ] }, { "cell_type": "markdown", "id": "c6ede79e", "metadata": {}, "source": [ "`df.assign(new_column = old_column and condition)`" ] }, { "cell_type": "code", "execution_count": 162, "id": "f2d02060", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: 'Yes', 0: 'No'}" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "survived_mapping = {1: \"Yes\", 0 : \"No\"}\n", "survived_mapping" ] }, { "cell_type": "code", "execution_count": 163, "id": "109a4f0f", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedsurvived_mapped
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNSNo
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85CYes
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNSYes
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123SYes
4503Allen, Mr. William Henrymale35.0003734508.0500NaNSNo
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked survived_mapped \n", "0 0 A/5 21171 7.2500 NaN S No \n", "1 0 PC 17599 71.2833 C85 C Yes \n", "2 0 STON/O2. 3101282 7.9250 NaN S Yes \n", "3 0 113803 53.1000 C123 S Yes \n", "4 0 373450 8.0500 NaN S No " ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.assign(survived_mapped = df['Survived'].map(survived_mapping)).head()" ] }, { "cell_type": "markdown", "id": "52490134", "metadata": {}, "source": [ "**If you want to specify the location**" ] }, { "cell_type": "code", "execution_count": 164, "id": "001dc507", "metadata": {}, "outputs": [], "source": [ "df.insert(2, \"survived_mapped\", df['Survived'].map(survived_mapping))" ] }, { "cell_type": "markdown", "id": "2e2fae2a", "metadata": {}, "source": [ "**Deleting a column**" ] }, { "cell_type": "code", "execution_count": 165, "id": "a873c75c", "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", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S " ] }, "execution_count": 165, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.drop(columns = 'survived_mapped').head(3)" ] }, { "cell_type": "code", "execution_count": 166, "id": "bc868282", "metadata": {}, "outputs": [], "source": [ "# del df['survived_mapped']" ] }, { "cell_type": "markdown", "id": "8480fb9b", "metadata": {}, "source": [ "### Column rename" ] }, { "cell_type": "code", "execution_count": 167, "id": "8f8c8d39", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['PassengerId', 'Survived', 'survived_mapped', 'Pclass', 'Name', 'Sex',\n", " 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],\n", " dtype='object')" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "markdown", "id": "99d0ebd2-b0b6-4e5d-845c-312d917c89d3", "metadata": {}, "source": [ "**Change:** \n", "* Sex --> gender \n", "* survived --> survived_number" ] }, { "cell_type": "code", "execution_count": 168, "id": "75d9c073", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "new_names = ['PassengerId', 'survived_number', 'survived_mapped', 'Pclass', 'Name', 'gender',\n", " 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin_Number', 'Embarked']\n", "\n", "print(type(new_names))" ] }, { "cell_type": "code", "execution_count": 169, "id": "b87e43c7", "metadata": {}, "outputs": [], "source": [ "df.columns = new_names # replace the existing names with new names" ] }, { "cell_type": "code", "execution_count": 170, "id": "9e15dc92", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['PassengerId', 'survived_number', 'survived_mapped', 'Pclass', 'Name',\n", " 'gender', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin_Number',\n", " 'Embarked'],\n", " dtype='object')" ] }, "execution_count": 170, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "markdown", "id": "1e2227ef-fe6e-4e2b-ad19-3b63789f6daf", "metadata": {}, "source": [ "**You can also use the `df.rename()` function to change the column names**" ] }, { "cell_type": "markdown", "id": "7f6c11a8", "metadata": {}, "source": [ "### Column value replace" ] }, { "cell_type": "markdown", "id": "65c5f660", "metadata": {}, "source": [ "Embarked location names : Southampton, Cherbourg, and Queenstown" ] }, { "cell_type": "code", "execution_count": 171, "id": "f8111aa2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Embarked
0S
1C
\n", "
" ], "text/plain": [ " Embarked\n", "0 S\n", "1 C" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['Embarked']].head(2)" ] }, { "cell_type": "code", "execution_count": 172, "id": "5de42644", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Southampton\n", "1 Cherbourg\n", "2 Southampton\n", "3 Southampton\n", "4 Southampton\n", " ... \n", "886 Southampton\n", "887 Southampton\n", "888 Southampton\n", "889 Cherbourg\n", "890 Queenstown\n", "Name: Embarked, Length: 891, dtype: object" ] }, "execution_count": 172, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Embarked'].replace({ \"S\": \"Southampton\", \n", " \"C\": \" Cherbourg\", \n", " \"Q\": \"Queenstown\"})" ] }, { "cell_type": "code", "execution_count": 173, "id": "68167c47", "metadata": {}, "outputs": [], "source": [ "df['Embarked'] = df['Embarked'].replace({ \"S\": \"Southampton\", \n", " \"C\": \" Cherbourg\", \n", " \"Q\": \"Queenstown\"})" ] }, { "cell_type": "code", "execution_count": 174, "id": "6fd6bd03", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Embarked
0Southampton
1Cherbourg
\n", "
" ], "text/plain": [ " Embarked\n", "0 Southampton\n", "1 Cherbourg" ] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['Embarked']].head(2)" ] }, { "cell_type": "markdown", "id": "20bb2507", "metadata": {}, "source": [ "### Data summary" ] }, { "cell_type": "code", "execution_count": 175, "id": "085fee96", "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", "
PassengerIdsurvived_numbersurvived_mappedPclassNamegenderAgeSibSpParchTicketFareCabin_NumberEmbarked
010No3Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNSouthampton
121Yes1Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85Cherbourg
\n", "
" ], "text/plain": [ " PassengerId survived_number survived_mapped Pclass \\\n", "0 1 0 No 3 \n", "1 2 1 Yes 1 \n", "\n", " Name gender Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "\n", " Parch Ticket Fare Cabin_Number Embarked \n", "0 0 A/5 21171 7.2500 NaN Southampton \n", "1 0 PC 17599 71.2833 C85 Cherbourg " ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "code", "execution_count": 176, "id": "3bf9648f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "29.69911764705882" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Age'].mean()" ] }, { "cell_type": "markdown", "id": "0940a6fe", "metadata": {}, "source": [ "**Calculate avg fare**" ] }, { "cell_type": "code", "execution_count": 177, "id": "72600668", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32.204207968574636" ] }, "execution_count": 177, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Fare'].mean()" ] }, { "cell_type": "code", "execution_count": 178, "id": "69d75975", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28.0" ] }, "execution_count": 178, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Age'].median()" ] }, { "cell_type": "markdown", "id": "f977a1da", "metadata": {}, "source": [ "**How much money titanic**" ] }, { "cell_type": "code", "execution_count": 179, "id": "f8b1fa5c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28693.9493" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Fare'].sum()" ] }, { "cell_type": "code", "execution_count": 180, "id": "d7490726", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdsurvived_numberPclassAgeSibSpParchFare
count891.000891.000891.000714.000891.000891.000891.000
mean446.0000.3842.30929.6990.5230.38232.204
std257.3540.4870.83614.5261.1030.80649.693
min1.0000.0001.0000.4200.0000.0000.000
25%223.5000.0002.00020.1250.0000.0007.910
50%446.0000.0003.00028.0000.0000.00014.454
75%668.5001.0003.00038.0001.0000.00031.000
max891.0001.0003.00080.0008.0006.000512.329
\n", "
" ], "text/plain": [ " PassengerId survived_number Pclass Age SibSp Parch \\\n", "count 891.000 891.000 891.000 714.000 891.000 891.000 \n", "mean 446.000 0.384 2.309 29.699 0.523 0.382 \n", "std 257.354 0.487 0.836 14.526 1.103 0.806 \n", "min 1.000 0.000 1.000 0.420 0.000 0.000 \n", "25% 223.500 0.000 2.000 20.125 0.000 0.000 \n", "50% 446.000 0.000 3.000 28.000 0.000 0.000 \n", "75% 668.500 1.000 3.000 38.000 1.000 0.000 \n", "max 891.000 1.000 3.000 80.000 8.000 6.000 \n", "\n", " Fare \n", "count 891.000 \n", "mean 32.204 \n", "std 49.693 \n", "min 0.000 \n", "25% 7.910 \n", "50% 14.454 \n", "75% 31.000 \n", "max 512.329 " ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe().round(3) # takes only the numerical values by default" ] }, { "cell_type": "markdown", "id": "8a3e7b5a", "metadata": {}, "source": [ "**Details on the categorical values**" ] }, { "cell_type": "code", "execution_count": 181, "id": "4eefccf4", "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", "
survived_mappedNamegenderTicketCabin_NumberEmbarked
count891891891891204889
unique289126811473
topNoBraund, Mr. Owen Harrismale347082B96 B98Southampton
freq549157774644
\n", "
" ], "text/plain": [ " survived_mapped Name gender Ticket Cabin_Number \\\n", "count 891 891 891 891 204 \n", "unique 2 891 2 681 147 \n", "top No Braund, Mr. Owen Harris male 347082 B96 B98 \n", "freq 549 1 577 7 4 \n", "\n", " Embarked \n", "count 889 \n", "unique 3 \n", "top Southampton \n", "freq 644 " ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe(include = ['O']) # only for object" ] }, { "cell_type": "markdown", "id": "1419c880", "metadata": {}, "source": [ "**Customize the percentiles**" ] }, { "cell_type": "code", "execution_count": 182, "id": "c5d798ab", "metadata": {}, "outputs": [], "source": [ "# percentiles = [0, 0.25, 0.50, 0.60, 0.75, 0.80, 0.90, 0.95, 0.99]" ] }, { "cell_type": "code", "execution_count": 183, "id": "b51eda07", "metadata": {}, "outputs": [], "source": [ "# df.describe(percentiles)" ] }, { "cell_type": "markdown", "id": "a4fb02a5", "metadata": {}, "source": [ "**Summary Group wise**" ] }, { "cell_type": "code", "execution_count": 184, "id": "bd679245", "metadata": {}, "outputs": [], "source": [ "# df.groupby('Pclass').describe()" ] }, { "cell_type": "markdown", "id": "87ff9fa4", "metadata": {}, "source": [ "### Exploring column data" ] }, { "cell_type": "markdown", "id": "487f2b5c", "metadata": {}, "source": [ "**How many unique enteries are there?**" ] }, { "cell_type": "code", "execution_count": 185, "id": "cea0c0aa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Southampton', ' Cherbourg', 'Queenstown', nan], dtype=object)" ] }, "execution_count": 185, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the values\n", "df['Embarked'].unique()" ] }, { "cell_type": "code", "execution_count": 186, "id": "0bebc0c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 186, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# count the value\n", "df['Embarked'].nunique()" ] }, { "cell_type": "markdown", "id": "0b0520a5", "metadata": {}, "source": [ "**What is the frequency count?**" ] }, { "cell_type": "code", "execution_count": 187, "id": "f7924e52", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Embarked\n", "Southampton 644\n", " Cherbourg 168\n", "Queenstown 77\n", "NaN 2\n", "Name: count, dtype: int64" ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Embarked\"].value_counts(dropna= False) # by default its true" ] }, { "cell_type": "code", "execution_count": 188, "id": "92609032", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Embarked\n", "Southampton 0.722783\n", " Cherbourg 0.188552\n", "Queenstown 0.086420\n", "NaN 0.002245\n", "Name: proportion, dtype: float64" ] }, "execution_count": 188, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Embarked\"].value_counts(dropna= False, normalize = True) # by default its true" ] }, { "cell_type": "code", "execution_count": 189, "id": "0324504f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pclass\n", "3 0.551\n", "1 0.242\n", "2 0.207\n", "Name: proportion, dtype: float64" ] }, "execution_count": 189, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Pclass\"].value_counts(dropna= False, normalize = True).round(3) " ] }, { "cell_type": "code", "execution_count": 190, "id": "a8e91b9f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Embarked\n", "Southampton 0.72\n", " Cherbourg 0.19\n", "Queenstown 0.09\n", "NaN 0.00\n", "Name: proportion, dtype: float64" ] }, "execution_count": 190, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Embarked\"].value_counts(dropna= False, normalize = True).round(2) # get the percenatge " ] }, { "cell_type": "markdown", "id": "c5e94426", "metadata": {}, "source": [ "### Data manipulation\n", "\n", "```{tip}\n", "Useful functions are (click on the links) : \n", "\n", "* [`df.pivot_table()`](https://pbpython.com/pandas-pivot-table-explained.html)\n", "* [`df.unstack()`](https://towardsdatascience.com/reshaping-a-dataframe-with-pandas-stack-and-unstack-925dc9ce1289)\n", "* [`df.melt()`](https://www.digitalocean.com/community/tutorials/pandas-melt-unmelt-pivot-function)\n", "\n", "```" ] }, { "cell_type": "code", "execution_count": 191, "id": "a67bfaa9", "metadata": {}, "outputs": [], "source": [ "# example code\n", "# pd.pivot_table(index = 'survived_mapped', columns = \"Pclass\", data = df)['Fare'].round(2)" ] }, { "cell_type": "markdown", "id": "51a2229d", "metadata": {}, "source": [ "**What is the distrbution of Survived passengers across pclass**" ] }, { "cell_type": "code", "execution_count": 192, "id": "1951c3d0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "survived_mapped\n", "No 549\n", "Yes 342\n", "Name: count, dtype: int64" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"survived_mapped\"].value_counts()" ] }, { "cell_type": "code", "execution_count": 193, "id": "fc13b712", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "survived_mapped\n", "No 0.62\n", "Yes 0.38\n", "Name: proportion, dtype: float64" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"survived_mapped\"].value_counts(normalize = True).round(2)" ] }, { "cell_type": "code", "execution_count": 194, "id": "1be15516", "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", "
Pclass123
survived_mapped
No8097372
Yes13687119
\n", "
" ], "text/plain": [ "Pclass 1 2 3\n", "survived_mapped \n", "No 80 97 372\n", "Yes 136 87 119" ] }, "execution_count": 194, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.crosstab(df[\"survived_mapped\"], df[\"Pclass\"])" ] }, { "cell_type": "code", "execution_count": 195, "id": "2f5e6bc9", "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", "
genderfemalemale
survived_mapped
No81468
Yes233109
\n", "
" ], "text/plain": [ "gender female male\n", "survived_mapped \n", "No 81 468\n", "Yes 233 109" ] }, "execution_count": 195, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.crosstab(df[\"survived_mapped\"], df[\"gender\"])" ] }, { "cell_type": "markdown", "id": "89fd0b2a", "metadata": {}, "source": [ "### Grouping data" ] }, { "cell_type": "markdown", "id": "52e89735", "metadata": {}, "source": [ "**Group by allows you to calculate numeric summaries across a categorical value**\n" ] }, { "cell_type": "markdown", "id": "d53e73d4", "metadata": {}, "source": [ "\n", "![split_apply_combine](images/split_apply_combine.png)\n" ] }, { "cell_type": "markdown", "id": "2d4d4f17", "metadata": {}, "source": [ "**What is the average age for each gender group**" ] }, { "cell_type": "code", "execution_count": 196, "id": "12b6a91a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "29.69911764705882" ] }, "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean for the column\n", "df[\"Age\"].mean()" ] }, { "cell_type": "code", "execution_count": 197, "id": "3e2e7081", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "gender\n", "female 27.92\n", "male 30.73\n", "Name: Age, dtype: float64" ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Sex group\n", "df.groupby(\"gender\")[\"Age\"].mean().round(2)" ] }, { "cell_type": "code", "execution_count": 198, "id": "9b8560f7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pclass\n", "1 38.0\n", "2 30.0\n", "3 25.0\n", "Name: Age, dtype: float64" ] }, "execution_count": 198, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Pclass\n", "df.groupby(\"Pclass\")[\"Age\"].mean().round()" ] }, { "cell_type": "code", "execution_count": 199, "id": "64568d85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pclass\n", "1 84.0\n", "2 21.0\n", "3 14.0\n", "Name: Fare, dtype: float64" ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Pclass\n", "df.groupby(\"Pclass\")[\"Fare\"].mean().round()" ] }, { "cell_type": "code", "execution_count": 200, "id": "b8a7d510", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pclass\n", "1 60.0\n", "2 14.0\n", "3 8.0\n", "Name: Fare, dtype: float64" ] }, "execution_count": 200, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Pclass\n", "df.groupby(\"Pclass\")[\"Fare\"].median().round()" ] }, { "cell_type": "markdown", "id": "f5654635", "metadata": {}, "source": [ "```py \n", "df.groupby(\"column\")[\"numeric_column\"].whichfunction()\n", "```" ] }, { "cell_type": "code", "execution_count": 201, "id": "0639b468", "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", "
PclassgenderAge
01female34.6
11male41.3
22female28.7
32male30.7
43female21.8
53male26.5
\n", "
" ], "text/plain": [ " Pclass gender Age\n", "0 1 female 34.6\n", "1 1 male 41.3\n", "2 2 female 28.7\n", "3 2 male 30.7\n", "4 3 female 21.8\n", "5 3 male 26.5" ] }, "execution_count": 201, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Sex group\n", "df.groupby([\"Pclass\", \"gender\"])[\"Age\"].mean().reset_index().round(1)" ] }, { "cell_type": "code", "execution_count": 202, "id": "17d9a6d9", "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", "
PclassgenderFare
01female82.7
11male41.3
22female22.0
32male13.0
43female12.5
53male7.9
\n", "
" ], "text/plain": [ " Pclass gender Fare\n", "0 1 female 82.7\n", "1 1 male 41.3\n", "2 2 female 22.0\n", "3 2 male 13.0\n", "4 3 female 12.5\n", "5 3 male 7.9" ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Sex group\n", "df.groupby([\"Pclass\", \"gender\"])[\"Fare\"].median().reset_index().round(1)" ] }, { "cell_type": "code", "execution_count": 203, "id": "9af87e54", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pclassgendersurvived_mappedFare
01femaleNo110.6
11femaleYes106.0
21maleNo62.9
31maleYes74.6
42femaleNo18.2
52femaleYes22.3
62maleNo19.5
72maleYes21.1
83femaleNo19.8
93femaleYes12.5
103maleNo12.2
113maleYes15.6
\n", "
" ], "text/plain": [ " Pclass gender survived_mapped Fare\n", "0 1 female No 110.6\n", "1 1 female Yes 106.0\n", "2 1 male No 62.9\n", "3 1 male Yes 74.6\n", "4 2 female No 18.2\n", "5 2 female Yes 22.3\n", "6 2 male No 19.5\n", "7 2 male Yes 21.1\n", "8 3 female No 19.8\n", "9 3 female Yes 12.5\n", "10 3 male No 12.2\n", "11 3 male Yes 15.6" ] }, "execution_count": 203, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Sex group\n", "df.groupby([\"Pclass\", \"gender\", \"survived_mapped\"])[\"Fare\"].mean().reset_index().round(1)" ] }, { "cell_type": "code", "execution_count": 204, "id": "8f8b0ca2", "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", "
PclassgenderAge
01female34.61
11male41.28
22female28.72
32male30.74
43female21.75
53male26.51
\n", "
" ], "text/plain": [ " Pclass gender Age\n", "0 1 female 34.61\n", "1 1 male 41.28\n", "2 2 female 28.72\n", "3 2 male 30.74\n", "4 3 female 21.75\n", "5 3 male 26.51" ] }, "execution_count": 204, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calculating the mean based on Sex group\n", "df.groupby([\"Pclass\", \"gender\"])[\"Age\"].mean().reset_index().round(2)" ] }, { "cell_type": "markdown", "id": "40a3e553", "metadata": {}, "source": [ "**Groupby on multiple columns and aggregations on different columns**" ] }, { "cell_type": "code", "execution_count": 205, "id": "92c2374c", "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", "
PclassgenderAgeFare
01female34.6182.66
11male41.2841.26
22female28.7222.00
32male30.7413.00
43female21.7512.48
53male26.517.92
\n", "
" ], "text/plain": [ " Pclass gender Age Fare\n", "0 1 female 34.61 82.66\n", "1 1 male 41.28 41.26\n", "2 2 female 28.72 22.00\n", "3 2 male 30.74 13.00\n", "4 3 female 21.75 12.48\n", "5 3 male 26.51 7.92" ] }, "execution_count": 205, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# # calculating the mean based on Sex group\n", "df.groupby([\"Pclass\", \"gender\"]).agg({'Age':'mean', 'Fare':'median'}).round(2).reset_index()" ] }, { "cell_type": "markdown", "id": "d63573a0", "metadata": {}, "source": [ "### Changing the column data type\n", "\n", "Often, we need to convert the datatype of a column. We will make use of the `.astype()` method to achieve this. " ] }, { "cell_type": "code", "execution_count": 206, "id": "2f036362", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3\n", "1 1\n", "2 3\n", "3 1\n", "4 3\n", " ..\n", "886 2\n", "887 1\n", "888 3\n", "889 1\n", "890 3\n", "Name: Pclass, Length: 891, dtype: int64" ] }, "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# calling a single column\n", "df['Pclass']" ] }, { "cell_type": "code", "execution_count": 207, "id": "b1d9cab7", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 207, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(df['Pclass'])" ] }, { "cell_type": "code", "execution_count": 208, "id": "30f1d86a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3\n", "1 1\n", "2 3\n", "3 1\n", "4 3\n", " ..\n", "886 2\n", "887 1\n", "888 3\n", "889 1\n", "890 3\n", "Name: Pclass, Length: 891, dtype: object" ] }, "execution_count": 208, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# converting the Pclass to an object from integer\n", "df['Pclass'].astype('object')" ] }, { "cell_type": "code", "execution_count": 209, "id": "a0b28f16", "metadata": {}, "outputs": [], "source": [ "# Replace the original column with the new modified column\n", "df['Pclass'] = df['Pclass'].astype('object')" ] }, { "cell_type": "code", "execution_count": 210, "id": "d738b2ec", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3\n", "1 1\n", "2 3\n", "3 1\n", "4 3\n", " ..\n", "886 2\n", "887 1\n", "888 3\n", "889 1\n", "890 3\n", "Name: Pclass, Length: 891, dtype: object" ] }, "execution_count": 210, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Pclass'] " ] }, { "cell_type": "markdown", "id": "5109b45a", "metadata": {}, "source": [ "### Missing values" ] }, { "cell_type": "markdown", "id": "1268e7dd", "metadata": {}, "source": [ "```{note}\n", "**Pandas has got extensive functions to deal with missing data** \n", "\n", "* `df.isna()` or `df.isnull()`\n", "* `df.notna()` or `df.notnull()`\n", "* `df.fillna()`\n", "* `df.dropna()`\n", "\n", "```" ] }, { "cell_type": "markdown", "id": "5ac32943", "metadata": {}, "source": [ "**Get the sum of missing values across columns**\n" ] }, { "cell_type": "code", "execution_count": 211, "id": "a9956a53", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PassengerId 0\n", "survived_number 0\n", "survived_mapped 0\n", "Pclass 0\n", "Name 0\n", "gender 0\n", "Age 177\n", "SibSp 0\n", "Parch 0\n", "Ticket 0\n", "Fare 0\n", "Cabin_Number 687\n", "Embarked 2\n", "dtype: int64" ] }, "execution_count": 211, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isna().sum()" ] }, { "cell_type": "markdown", "id": "ca908613", "metadata": {}, "source": [ "**Get the sum of missing values across rows**\n" ] }, { "cell_type": "code", "execution_count": 212, "id": "5e49c05f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 0\n", "2 1\n", "3 0\n", "4 1\n", " ..\n", "886 1\n", "887 0\n", "888 2\n", "889 0\n", "890 1\n", "Length: 891, dtype: int64" ] }, "execution_count": 212, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isna().sum(axis = 1)" ] }, { "cell_type": "code", "execution_count": 213, "id": "6b33092a", "metadata": {}, "outputs": [], "source": [ "# df.head()" ] }, { "cell_type": "markdown", "id": "4248635e", "metadata": {}, "source": [ "**Get the percentage of missing values across columns**" ] }, { "cell_type": "code", "execution_count": 214, "id": "e9f9ca13", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PassengerId 0.00\n", "survived_number 0.00\n", "survived_mapped 0.00\n", "Pclass 0.00\n", "Name 0.00\n", "gender 0.00\n", "Age 0.20\n", "SibSp 0.00\n", "Parch 0.00\n", "Ticket 0.00\n", "Fare 0.00\n", "Cabin_Number 0.77\n", "Embarked 0.00\n", "dtype: float64" ] }, "execution_count": 214, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isna().mean().round(2)" ] }, { "cell_type": "markdown", "id": "25436479", "metadata": {}, "source": [ "**Adding the missing rows as a new column to the dataframe**" ] }, { "cell_type": "code", "execution_count": 215, "id": "a09a8179", "metadata": {}, "outputs": [], "source": [ "df[\"missing_rows\"] = df.isna().sum(axis = 1)" ] }, { "cell_type": "code", "execution_count": 216, "id": "5f823569", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdsurvived_numbersurvived_mappedPclassNamegenderAgeSibSpParchTicketFareCabin_NumberEmbarkedmissing_rows
010No3Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNSouthampton1
121Yes1Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85Cherbourg0
231Yes3Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNSouthampton1
341Yes1Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123Southampton0
450No3Allen, Mr. William Henrymale35.0003734508.0500NaNSouthampton1
\n", "
" ], "text/plain": [ " PassengerId survived_number survived_mapped Pclass \\\n", "0 1 0 No 3 \n", "1 2 1 Yes 1 \n", "2 3 1 Yes 3 \n", "3 4 1 Yes 1 \n", "4 5 0 No 3 \n", "\n", " Name gender Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin_Number Embarked missing_rows \n", "0 0 A/5 21171 7.2500 NaN Southampton 1 \n", "1 0 PC 17599 71.2833 C85 Cherbourg 0 \n", "2 0 STON/O2. 3101282 7.9250 NaN Southampton 1 \n", "3 0 113803 53.1000 C123 Southampton 0 \n", "4 0 373450 8.0500 NaN Southampton 1 " ] }, "execution_count": 216, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the new column at the end\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 217, "id": "a9dd9ea0", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdsurvived_numbersurvived_mappedPclassNamegenderAgeSibSpParchTicketFareCabin_NumberEmbarkedmissing_rows
560No3Moran, Mr. JamesmaleNaN003308778.4583NaNQueenstown2
17181Yes2Williams, Mr. Charles EugenemaleNaN0024437313.0000NaNSouthampton2
19201Yes3Masselmani, Mrs. FatimafemaleNaN0026497.2250NaNCherbourg2
26270No3Emir, Mr. Farred ChehabmaleNaN0026317.2250NaNCherbourg2
28291Yes3O'Dwyer, Miss. Ellen \"Nellie\"femaleNaN003309597.8792NaNQueenstown2
\n", "
" ], "text/plain": [ " PassengerId survived_number survived_mapped Pclass \\\n", "5 6 0 No 3 \n", "17 18 1 Yes 2 \n", "19 20 1 Yes 3 \n", "26 27 0 No 3 \n", "28 29 1 Yes 3 \n", "\n", " Name gender Age SibSp Parch Ticket Fare \\\n", "5 Moran, Mr. James male NaN 0 0 330877 8.4583 \n", "17 Williams, Mr. Charles Eugene male NaN 0 0 244373 13.0000 \n", "19 Masselmani, Mrs. Fatima female NaN 0 0 2649 7.2250 \n", "26 Emir, Mr. Farred Chehab male NaN 0 0 2631 7.2250 \n", "28 O'Dwyer, Miss. Ellen \"Nellie\" female NaN 0 0 330959 7.8792 \n", "\n", " Cabin_Number Embarked missing_rows \n", "5 NaN Queenstown 2 \n", "17 NaN Southampton 2 \n", "19 NaN Cherbourg 2 \n", "26 NaN Cherbourg 2 \n", "28 NaN Queenstown 2 " ] }, "execution_count": 217, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subseting the data only for rows with more than 1 missing rows\n", "df.query(\"missing_rows > 1\").head()" ] }, { "cell_type": "markdown", "id": "51abbd9d", "metadata": {}, "source": [ "**Find column which have atleast three missing values**" ] }, { "cell_type": "code", "execution_count": 218, "id": "f37ab2bf", "metadata": { "scrolled": true }, "outputs": [], "source": [ "# df.isna().sum() >= 3 " ] }, { "cell_type": "markdown", "id": "6801c492", "metadata": {}, "source": [ "### Joining Data " ] }, { "cell_type": "markdown", "id": "24df676e", "metadata": {}, "source": [ "**While working on a problem, you would require to join datasets from different sources. Very important to understand different joins and how to do it in python**\n", "\n", "**The major joins used are: `left`, `inner`, `right`, `cross`**\n", "\n", "The below animations are from [here](https://www.garrickadenbuie.com/project/tidyexplain/#tidy-data)" ] }, { "cell_type": "markdown", "id": "fb599dad", "metadata": {}, "source": [ "**Left join**\n", "\n", "```py\n", "df1.merge(df2, on = 'column_name', how = 'left') \n", "\n", "```" ] }, { "cell_type": "markdown", "id": "341e30d3", "metadata": {}, "source": [ "![left_join](images/left_join.gif)" ] }, { "cell_type": "markdown", "id": "9dd6f31e", "metadata": {}, "source": [ "**Inner join**\n", "\n", "```py\n", "df1.merge(df2, on = 'column_name', how = 'inner') \n", "\n", "```" ] }, { "cell_type": "markdown", "id": "f536f0fe", "metadata": {}, "source": [ "![inner_join](images/inner_join.gif)" ] }, { "cell_type": "markdown", "id": "4800032c", "metadata": {}, "source": [ "**Right join**\n", "\n", "```py\n", "df1.merge(df2, on = 'column_name', how = 'right') \n", "\n", "```" ] }, { "cell_type": "markdown", "id": "f343d83c", "metadata": {}, "source": [ "![right_join](images/right_join.gif)" ] }, { "cell_type": "markdown", "id": "ef54a7eb", "metadata": {}, "source": [ "**Lets create a class data-frame which we will join the to titanic dataset**" ] }, { "cell_type": "code", "execution_count": 219, "id": "6794ffd5", "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", "
PclassClass
01FirstC
12SecondC
23ThirdC
\n", "
" ], "text/plain": [ " Pclass Class\n", "0 1 FirstC\n", "1 2 SecondC\n", "2 3 ThirdC" ] }, "execution_count": 219, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class_details = pd.DataFrame({\"Pclass\": [1, 2, 3] , \"Class\": [\"FirstC\", \"SecondC\", \"ThirdC\"]})\n", "class_details" ] }, { "cell_type": "code", "execution_count": 220, "id": "0c4a00b4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(891, 14)" ] }, "execution_count": 220, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check the dimensions of df dataset\n", "df.shape" ] }, { "cell_type": "code", "execution_count": 221, "id": "624f99dc", "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", "
PassengerIdsurvived_numbersurvived_mappedPclassNamegenderAgeSibSpParchTicketFareCabin_NumberEmbarkedmissing_rowsClass
010No3Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNSouthampton1ThirdC
121Yes1Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85Cherbourg0FirstC
\n", "
" ], "text/plain": [ " PassengerId survived_number survived_mapped Pclass \\\n", "0 1 0 No 3 \n", "1 2 1 Yes 1 \n", "\n", " Name gender Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "\n", " Parch Ticket Fare Cabin_Number Embarked missing_rows Class \n", "0 0 A/5 21171 7.2500 NaN Southampton 1 ThirdC \n", "1 0 PC 17599 71.2833 C85 Cherbourg 0 FirstC " ] }, "execution_count": 221, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.merge(class_details, on = \"Pclass\", how = 'left').head(2)" ] }, { "cell_type": "code", "execution_count": 222, "id": "a629cf1f", "metadata": {}, "outputs": [], "source": [ "df = df.merge(class_details, on = \"Pclass\", how = 'left')" ] }, { "cell_type": "code", "execution_count": 223, "id": "953bb830", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(891, 15)" ] }, "execution_count": 223, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check the dimensions of df dataset\n", "df.shape" ] }, { "cell_type": "markdown", "id": "21681bd9", "metadata": {}, "source": [ "### Inbuilt Plotting \n", "\n", "[Pandas has an inbuilt method to quickly plot charts](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html)\n", "\n", "\n", "* `df.hist()` - for numeric values\n", "* `df['column'].plot( kind = 'Chart type')` - synatx for plotting\n" ] }, { "cell_type": "code", "execution_count": 224, "id": "01a53111", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pclass\n", "3 491\n", "1 216\n", "2 184\n", "Name: count, dtype: int64" ] }, "execution_count": 224, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.value_counts('Pclass')" ] }, { "cell_type": "code", "execution_count": 225, "id": "bd81d9e2", "metadata": {}, "outputs": [ { "data": { "image/png": "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w4cPa+PGjXr33XclSe+++64efPBBzZo1S7t27Qrz7ICu6urqNGvWrHBPA32M3+/X7t27dejQoS7HPv/8cz3zzDNhmFXfwveg9CHbt2/X7bffroEDB+qzzz5TeXm5/vEf/1HXXXedLMtSZWWlXnvtNd12223hnioQ8Mc//lE33HCDOjs7wz0V9BHvv/++srOzdfToUdlsNt1666167rnnNHz4cEnSxx9/LI/Hw2vyEiNQ+pBx48bptttu009+8hOVlZUpLy9PDz74oH76059KkpYsWaK9e/dqx44dYZ4p+pIXX3zxS4//5S9/0cKFC/ljgMtm+vTpOnHihDZu3Ki//e1vWrBggQ4cOKA33nhDI0aMIFAuEwKlD3E6naqurtbVV1+tkydPym636+2339YNN9wgSTpw4ICysrLk9XrDPFP0Jf369ZPNZtOX/U+RzWbjjwEuG5fLpZ07dyotLS2wb+7cudq2bZtef/11xcbGEiiXAdeg9FH9+vVTdHS0Bg0aFNgXFxcnn88XvkmhTxo+fLief/55nTx58ozbH/7wh3BPEX2M3+9XRETwT9U9/fTTysnJ0YQJE/T++++HaWZ9C4HShyQlJemDDz4I3H7rrbc0YsSIwO26urrAe6zA5ZKenv6lEXKu1RWgu11zzTXat29fl/2rV6/W7bffrpycnDDMqu8hUPqQBx98MGhJMjU1Nej/Jbz66qtcIIvL7uGHH9a4cePOevzqq6/W66+/fhlnhL5u+vTpeu655854bM2aNbrnnnuI5suAa1AAAIBxWEEBAADGIVAAAIBxCBQAAGAcAgVAWN1///36zne+E+5pADAMgQLgot1///2y2Wyy2WyKjIzUVVddpUWLFqm1tTXcUwPQQ0WcewgAnNu3vvUtbdy4UR0dHXrzzTf1/e9/X62trVq7dm24pwagB2IFBUC3sNvtcrvdSkxMVG5uru6991698MILkqSDBw9qypQpcjgciouL06233qo///nPZ3yc7du365ZbbtGgQYOUkJCgqVOnBo1tb2/XvHnzNHz4cEVHRyspKUnFxcWB44WFhRoxYoTsdrs8Ho8eeuihS3reAC4NVlAAXBIxMTHq6OjQX//6V40fP14ZGRnatWuXHA6Hfv/73+vEiRNnvF9ra6sWLFigtLQ0tba26sc//rGmT5+umpoa9evXT0899ZRefPFF/frXv9aIESNUV1enuro6SdJ///d/a+XKlSorK9PXvvY1eb1e/fGPf7ycpw2gmxAoALrdO++8oy1btigzM1NPP/20nE6nysrKFBkZKUn6yle+ctb73nnnnUG3N2zYoGHDhunQoUNKTU3V0aNHlZKSoltuuUU2m01XXnllYOzRo0fldruVlZWlyMhIjRgxQjfddNOlOUkAlxRv8QDoFtu2bdPAgQMVHR2tsWPHavz48Vq9erVqamp06623BuLkXP785z8rNzdXV111lRwOh5KTkyV9ER/SFxfk1tTUaOTIkXrooYe0Y8eOwH3//u//Xn6/X1dddZUeeOABlZeXn3WlBoDZCBQA3eKb3/ymampq9N577+nzzz/X1q1bNWzYMMXExIT0ONOmTdPx48e1fv16vf3223r77bclfXHtiSTdcMMNqq2t1eOPPy6/368ZM2borrvukiQlJibqvffe09NPP62YmBjl5eVp/Pjx6ujo6N6TBXDJESgAukVsbKyuvvpqXXnllUGrJaNGjdKbb755XpFw/PhxHT58WD/60Y+UmZmpa6+9Vo2NjV3GORwO3X333Vq/fr1+9atf6fnnn9enn34q6YtrX3JycvTUU0/pjTfe0FtvvaX9+/d334kCuCy4BgXAJTVv3jytXr1aM2fOVEFBgZxOp/bs2aObbrpJI0eODBo7ePBgJSQkaN26dRo+fLiOHj2qRx55JGjMypUrNXz4cH39619Xv3799F//9V9yu90aNGiQSktL1dnZqTFjxmjAgAHavHmzYmJigq5TAdAzsIIC4JJKSEjQrl271NLSogkTJig9PV3r168/4zUp/fr1U1lZmaqrq5Wamqp/+Zd/0YoVK4LGDBw4UMuWLdPo0aN144036siRI3rllVfUr18/DRo0SOvXr9fNN9+sUaNG6be//a1eeuklJSQkXK7TBdBNbJZlWeGeBAAAwP+PFRQAAGAcAgUAABiHQAEAAMYhUAAAgHEIFAAAYBwCBQAAGIdAAQAAxiFQAACAcQgUAABgHAIFAAAYh0ABAADGIVAAAIBx/h8ZG1WfRIsBowAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['Pclass'].value_counts().plot(kind = 'bar', title = \"Bar Chart\");" ] }, { "cell_type": "code", "execution_count": 226, "id": "26c2e553", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['Pclass'].value_counts().plot(kind = 'pie');" ] }, { "cell_type": "code", "execution_count": 227, "id": "6d052f46", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABMIAAAKoCAYAAACVyFOmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAACf70lEQVR4nOz9e1xVdfr//z93HDYHgQSVDYmKDWWGmkFZWAOl4phoZWWllpXT2NtDkjoW2WdCp8CcUZm07K1jaqlRU1J20MTJKMcakbI89NV6ezaIyRBQCRRfvz/6uaYtooDABvbjfrut2639Wtfe63otaV+si3WwGWOMAAAAAAAAgBbuIlcnAAAAAAAAADQGGmEAAAAAAABwCzTCAAAAAAAA4BZohAEAAAAAAMAt0AgDAAAAAACAW6ARBgAAAAAAALdAIwwAAAAAAABugUYYAAAAAAAA3AKNMAAAAAAAALgFGmFwmSVLlshms1mLp6en2rdvrwcffFCHDh1ydXrNUqdOnZSUlHTeuL1798pms2nJkiUNnxQAtECna9jevXsbfdsPPPCAOnXq1OjbrW+pqamy2Wz68ccfXZ0KAOAsnn/+edlsNkVHR7s6FaBe0QiDyy1evFifffaZsrOz9fDDD+u1117TjTfeqGPHjrk6NQAAzmrgwIH67LPPFBYW5upUAABoEC+//LIkafv27fr3v//t4myA+kMjDC4XHR2t6667TjfddJOefvppTZkyRXv27NHbb7/t6tSajbKyMlenAADN2okTJ3Ty5Mkax7dt21bXXXed7HZ7A2aF+nD8+HFXpwAAzc7mzZv11VdfaeDAgZKkRYsWuTgjoP7QCEOTc91110mS9u3bp2nTpqlXr14KDg5WYGCgrr76ai1atEjGGKf3fPTRR0pISFBISIh8fX3VoUMH3XHHHU6//M6fP189evRQq1atFBAQoC5duujJJ590+pyCggKNHj1a7du3l7e3tyIjIzVt2jSng6PTlxX+9a9/1ezZsxUZGalWrVrp+uuv1+eff15lPgsXLtRll10mu92url27asWKFWe9rKWiokLPPPOMunTpIrvdrrZt2+rBBx/Uf/7zH6e405c/rly5Uj179pSPj4+mTZtW7f78/vvvNXToUAUEBCgoKEh33323CgoKzv2PAABN0H/+8x/94Q9/UEREhPU92bt3b61bt07SL9+PDzzwQJX3JSQkKCEhwXr98ccfy2az6dVXX9WkSZN0ySWXyG63a/v27bLZbGf9ZX/16tWy2WxatWqVpKqXRiYnJ8vf318lJSVV3nv33XcrNDRUJ06csMZef/11XX/99fL391erVq3Uv39/ffnll1Xeu2TJEl1++eWy2+264oor9Morr9Rmlzntg+joaOXm5urGG2+Un5+fOnfurBkzZujUqVNO2zvbJZ+n99nHH39c5TM/++wzxcXFydfXV506ddLixYslSe+//76uvvpq+fn5qVu3blqzZs1Zcztw4ICGDBmiwMBABQUFacSIEVVqn1SzffbAAw+oVatW2rp1qxITExUQEKA+ffrUaZ8BgDs7XQtnzJihuLg4ZWZmVvnDwsGDB3XnnXcqICBAF198sYYPH67c3Nyz3oJl8+bNGjx4sIKDg+Xj46OePXvqjTfeaKzpAE5ohKHJ+e677yT98tf2vXv3avTo0XrjjTe0cuVKDRkyROPHj9ef//xnK37v3r0aOHCgvL299fLLL2vNmjWaMWOG/P39VVFRIUnKzMzUmDFjFB8fr6ysLL399tt67LHHnC6/LCgo0LXXXqsPP/xQf/rTn7R69WqNGjVK6enpevjhh6vk+cILLyg7O1sZGRlavny5jh07pltuuUXFxcVWzIIFC/SHP/xB3bt318qVK/XUU09p2rRpTgcSknTq1CndeuutmjFjhoYNG6b3339fM2bMUHZ2thISEqqc8fXFF1/oj3/8ox599FGtWbNGd9xxx1n3ZVlZmfr27au1a9cqPT1d//jHP+RwOHT33XfX7h8FAJqA++67T2+//bb+9Kc/ae3atfr73/+uvn376vDhw3X6vJSUFO3fv18vvfSS3n33XUVERKhnz55WI+fXlixZonbt2umWW24562c99NBDOn78eJVf6o8cOaJ33nlHI0aMkJeXlyQpLS1N9957r7p27ao33nhDr776qkpLS3XjjTdqx44dTtt88MEHdcUVV+itt97SU089pT//+c/66KOP6jTfgoICDR8+XCNGjNCqVas0YMAApaSkaNmyZXX6vNOf+eCDD+r3v/+93nnnHXXr1k0PPfSQpk+frpSUFE2ZMkVvvfWWWrVqpdtuu03ff/99lc+4/fbb9Zvf/EZvvvmmUlNT9fbbb6t///5OjcOa7jPplz8sDR48WDfffLPeeeedc/6xCABQVVlZmV577TVdc801io6O1kMPPaTS0lL94x//sGKOHTumm266SevXr9dzzz2nN954Q6GhoWc9zli/fr169+6tI0eO6KWXXtI777yjq666SnfffTf3LIZrGMBFFi9ebCSZzz//3Jw4ccKUlpaa9957z7Rt29YEBASYgoICp/jKykpz4sQJM336dBMSEmJOnTpljDHmzTffNJLMli1bqt3WuHHjzMUXX3zOfEaPHm1atWpl9u3b5zT+17/+1Ugy27dvN8YYs2fPHiPJdOvWzZw8edKK27Rpk5FkXnvtNStfh8NhevXq5fR5+/btM15eXqZjx47W2GuvvWYkmbfeesspNjc310gyL774ojXWsWNH4+HhYXbu3FllDh07djQDBw60Xs+fP99IMu+8845T3MMPP2wkmcWLF59znwBAU9KqVSuTnJxc7fqOHTuakSNHVhmPj4838fHx1uv169cbSea3v/1tldjnn3/eSHL6jv3pp5+M3W43kyZNssZO17A9e/ZYY1dffbWJi4tz+rwXX3zRSDJbt241xhizf/9+4+npacaPH+8UV1paahwOhxk6dKgx5pcaEh4ebq6++mqr3hljzN69e6vUkJqIj483ksy///1vp/GuXbua/v37n3Nexvx3n61fv77KZ27evNkaO3z4sPHw8DC+vr7m0KFD1viWLVuMJPP8889bY08//bSRZB577DGnbS1fvtxIMsuWLTPG1HyfGWPMyJEjjSTz8ssv13DPAADO9MorrxhJ5qWXXjLG/PJ926pVK3PjjTdaMS+88IKRZFavXu303tGjR1c5zujSpYvp2bOnOXHihFNsUlKSCQsLM5WVlQ03GeAsOCMMLnfdddfJy8tLAQEBSkpKksPh0OrVqxUaGqqPPvpIffv2VVBQkDw8POTl5aU//elPOnz4sAoLCyVJV111lby9vfWHP/xBS5cu1e7du6ts49prr9WRI0d077336p133jnrE6ree+893XTTTQoPD9fJkyetZcCAAZKknJwcp/iBAwfKw8PDet29e3dJv1zSKUk7d+5UQUGBhg4d6vS+Dh06qHfv3lW2ffHFF2vQoEFO277qqqvkcDiqnEHWvXt3XXbZZefdt+vXr1dAQIAGDx7sND5s2LDzvhcAmpprr71WS5Ys0TPPPKPPP//c6Yyhujjb2bTDhw+X3W53+gv1a6+9pvLycj344IPn/LwHH3xQGzdu1M6dO62xxYsXW39Rl6QPP/xQJ0+e1P333+/0fe/j46P4+Hjr+37nzp36/vvvNWzYMNlsNuvzOnbsqLi4uDrN1+Fw6Nprr3Ua6969u1W36iIsLEwxMTHW6+DgYLVr105XXXWVwsPDrfErrrhCks66reHDhzu9Hjp0qDw9PbV+/XpJNd9nv1bdmdIAgPNbtGiRfH19dc8990iSWrVqpbvuukuffvqpvv32W0m/HBsFBATod7/7ndN77733XqfX3333nf6//+//s77rf/09fssttyg/P9+pbgKNgUYYXO6VV15Rbm6uvvzyS33//ff6+uuv1bt3b23atEmJiYmSfrnP1r/+9S/l5uZq6tSpkv57g/hLL71U69atU7t27TR27FhdeumluvTSS/W3v/3N2sZ9992nl19+Wfv27dMdd9yhdu3aqVevXsrOzrZifvjhB7377rvy8vJyWq688kpJqtI8CwkJcXp9+obJp/M6falOaGholTmfOfbDDz/oyJEj8vb2rrL9goKCKtuu6VPKDh8+fNbtOxyOGr0fAJqS119/XSNHjtTf//53XX/99QoODtb9999f5/senu27NDg4WIMHD9Yrr7yiyspKSb9conjttdda9aA6ZzbRduzYodzcXKcG2g8//CBJuuaaa6p837/++uvW9/3pGnK27+u6foefWbekX2rXhTxwJTg4uMqYt7d3lXFvb29J0s8//1wl/sz5eHp6KiQkxNoHNd1np/n5+SkwMLDOcwIAd/bdd9/pk08+0cCBA2WM0ZEjR3TkyBHdeeedkv77JMnqjjPOdpwjSZMnT67yHT5mzBhJVY+zgIbm6eoEgCuuuEKxsbFVxjMzM+Xl5aX33ntPPj4+1vjZniZ544036sYbb1RlZaU2b96suXPnKjk5WaGhodZfMh588EE9+OCDOnbsmD755BM9/fTTSkpK0q5du9SxY0e1adNG3bt317PPPnvWPH/9l+2aOH3AcfrL/9fOPGhr06aNQkJCqr2RcEBAgNPrX58dcL4cNm3adN7tA0Bz0KZNG2VkZCgjI0P79+/XqlWr9MQTT6iwsFBr1qyRj4+PysvLq7zvxx9/VJs2baqMV/dd+uCDD+of//iHsrOz1aFDB+Xm5mr+/Pnnza9169a69dZb9corr+iZZ57R4sWL5ePj4/TX8dN5vPnmm+rYsWO1n3W6hpzt+7ohv8NP19sz92NDHqQUFBTokksusV6fPHlShw8ftvZBTffZaTWtkQCAql5++WUZY/Tmm2/qzTffrLJ+6dKleuaZZ2p8nHH6OzwlJUVDhgw56zYvv/zyesgcqDkaYWiybDabPD09nS4/LCsr06uvvlrtezw8PNSrVy916dJFy5cv1xdffGE1wk7z9/fXgAEDVFFRodtuu03bt29Xx44dlZSUpA8++ECXXnqpWrdufcH5X3755XI4HHrjjTc0ceJEa3z//v3auHGjU2MtKSlJmZmZqqysVK9evS5426fddNNNeuONN7Rq1SqnyyNXrFhRb9sAAFfo0KGDxo0bp3/+85/617/+JemXp0Z+/fXXTnG7du3Szp07z9oIq05iYqIuueQSLV68WB06dKjSzDqXBx98UG+88YY++OADLVu2TLfffrsuvvhia33//v3l6emp//u//zvn5XuXX365wsLC9Nprr2nixIlWc2ffvn1Vakh9Ov1E46+//trpwOT00zIbwvLly50ur3zjjTd08uRJ60mfNd1nAIALU1lZqaVLl+rSSy/V3//+9yrr33vvPc2aNUurV69WfHy83njjDa1evdq6lYz0y8kMv3b55ZcrKipKX331ldLS0hp8DkBN0AhDkzVw4EDNnj1bw4YN0x/+8AcdPnxYf/3rX61LEE976aWX9NFHH2ngwIHq0KGDfv75Z+uU3b59+0qSHn74Yfn6+qp3794KCwtTQUGB0tPTFRQUpGuuuUaSNH36dGVnZysuLk6PPvqoLr/8cv3888/au3evPvjgA7300ktq3759jfO/6KKLNG3aNI0ePVp33nmnHnroIR05ckTTpk1TWFiYLrrov1cm33PPPVq+fLluueUWTZgwQddee628vLx08OBBrV+/Xrfeeqtuv/32Wu/D+++/X3PmzNH999+vZ599VlFRUfrggw/04Ycf1vqzAMCViouLddNNN2nYsGHq0qWLAgIClJubqzVr1lh/Yb7vvvs0YsQIjRkzRnfccYf27dunmTNnqm3btrXaloeHh+6//37Nnj1bgYGBGjJkiIKCgmr03sTERLVv315jxoyxnqj4a506ddL06dM1depU7d69W7/73e/UunVr/fDDD9q0aZP8/f01bdo0XXTRRfrzn/+s3//+97r99tv18MMP68iRI0pNTW3Qy9uvueYaXX755Zo8ebJOnjyp1q1bKysrSxs2bGiwba5cuVKenp7q16+ftm/frv/3//6fevToYd1js6b7DABwYVavXq3vv/9ezz33nPXHiF+Ljo7WvHnztGjRIi1btkxz5szRiBEj9Mwzz+g3v/mNVq9ebR1n/PpY53//9381YMAA9e/fXw888IAuueQS/fTTT/rmm2/0xRdfOD2NEmgUrr5bP9zX6SdT5ebmVhvz8ssvm8svv9zY7XbTuXNnk56ebhYtWuT0RKvPPvvM3H777aZjx47GbrebkJAQEx8fb1atWmV9ztKlS81NN91kQkNDjbe3twkPDzdDhw41X3/9tdP2/vOf/5hHH33UREZGGi8vLxMcHGxiYmLM1KlTzdGjR40x/31q5F/+8pcq+UoyTz/9tNPYggULzG9+8xvj7e1tLrvsMvPyyy+bW2+91fTs2dMp7sSJE+avf/2r6dGjh/Hx8TGtWrUyXbp0MaNHjzbffvutFXfmkyF/7WzrDh48aO644w7TqlUrExAQYO644w6zceNGnhoJoFn5+eefzSOPPGK6d+9uAgMDja+vr7n88svN008/bY4dO2aMMebUqVNm5syZpnPnzsbHx8fExsaajz76qNqnRv7jH/+odnu7du0ykowkk52dXWV9dU9XNMaYJ5980kgyERER1T4J6+233zY33XSTCQwMNHa73XTs2NHceeedZt26dU5xf//7301UVJRTDRk5cmSdnhp55ZVXVhk/22ft2rXLJCYmmsDAQNO2bVszfvx48/7775/1qZFn+8zq6pQkM3bsWOv16adG5uXlmUGDBll16t577zU//PBDlffXZJ+NHDnS+Pv712SXAADOcNtttxlvb29TWFhYbcw999xjPD09TUFBgdm/f78ZMmSI03HGBx98cNan1n/11Vdm6NChpl27dsbLy8s4HA5z8803W0+mBBqTzRhjXNGAA9zVkSNHdNlll+m2227TggULXJ0OAAAAANSLtLQ0PfXUU9q/f3+trqYBGhOXRgINqKCgQM8++6xuuukmhYSEaN++fZozZ45KS0s1YcIEV6cHAAAAAHUyb948SVKXLl104sQJffTRR3r++ec1YsQImmBo0miEAQ3Ibrdr7969GjNmjH766Sf5+fnpuuuu00svvaQrr7zS1ekBAJq5yspKnevkfpvN5vTQGQAA6oufn5/mzJmjvXv3qry8XB06dNDjjz+up556ytWpAefEpZEAAADNVEJCgnJycqpd37FjR+3du7fxEgIAAGjiaIQBAAA0Uzt37lRpaWm16+12u7p169aIGQEAADRtNMIAAAAAAADgFi5ydQIAAAAAAABAY2iWN8s/deqUvv/+ewUEBMhms7k6HQBwCWOMSktLFR4erosu4u8arkA9AgDqUVNAPQKAmtejZtkI+/777xUREeHqNACgSThw4ACPqHYR6hEA/Bf1yHWoRwDwX+erR82yERYQECDpl8kFBga6OBsAcI2SkhJFRERY34lofNQjAKAeNQXUIwCoeT1qlo2w06f7BgYG8kUPwO1xCYTrUI8A4L+oR65DPQKA/zpfPeIifgAAAAAAALgFGmEAAAAAAABwCzTCAAAAAAAA4BZohAEAAAAAAMAt0AgDAAAAAACAW2iWT40EgIbS6Yn3XbLdvTMGumS7cC1X/LzxswYAcFf8ngdA4owwAAAAAAAAuAm3PCPMVX8JAAAAAAAAgOtwRhgAAAAAAADcAo0wAAAAAAAAuAUaYQAAAAAAAHALNMIAAAAAAADgFmiEAQAAAAAAwC245VMjAQAAAABoDJ2eeL/Rt7l3xsBG3ybQXHBGGAAAAAAAANwCjTAAAAAAAAC4BRphAIBmJzU1VTabzWlxOBzWemOMUlNTFR4eLl9fXyUkJGj79u1On1FeXq7x48erTZs28vf31+DBg3Xw4MHGngoAAACARkQjDADQLF155ZXKz8+3lq1bt1rrZs6cqdmzZ2vevHnKzc2Vw+FQv379VFpaasUkJycrKytLmZmZ2rBhg44ePaqkpCRVVla6YjoAAAAAGgE3ywcANEuenp5OZ4GdZoxRRkaGpk6dqiFDhkiSli5dqtDQUK1YsUKjR49WcXGxFi1apFdffVV9+/aVJC1btkwRERFat26d+vfv36hzAQAAANA46v2MsJMnT+qpp55SZGSkfH191blzZ02fPl2nTp2yYmpyyQoAAOfy7bffKjw8XJGRkbrnnnu0e/duSdKePXtUUFCgxMREK9Zutys+Pl4bN26UJOXl5enEiRNOMeHh4YqOjrZizqa8vFwlJSVOCwAAAIDmo94bYc8995xeeuklzZs3T998841mzpypv/zlL5o7d64VU5NLVgAAqE6vXr30yiuv6MMPP9TChQtVUFCguLg4HT58WAUFBZKk0NBQp/eEhoZa6woKCuTt7a3WrVtXG3M26enpCgoKspaIiIh6nhkAAACAhlTvjbDPPvtMt956qwYOHKhOnTrpzjvvVGJiojZv3iyp6iUr0dHRWrp0qY4fP64VK1bUdzoAgBZowIABuuOOO9StWzf17dtX77//vqRfLoE8zWazOb3HGFNl7Ezni0lJSVFxcbG1HDhw4AJmAQAAAKCx1Xsj7IYbbtA///lP7dq1S5L01VdfacOGDbrlllsk1eySFQAAasPf31/dunXTt99+a9037MwzuwoLC62zxBwOhyoqKlRUVFRtzNnY7XYFBgY6LQAAAACaj3pvhD3++OO699571aVLF3l5ealnz55KTk7WvffeK0k1umTlTNyTBQBwLuXl5frmm28UFhamyMhIORwOZWdnW+srKiqUk5OjuLg4SVJMTIy8vLycYvLz87Vt2zYrBgAAAEDLU+9PjXz99de1bNkyrVixQldeeaW2bNmi5ORkhYeHa+TIkVZcbS5ZSU9P17Rp0+o7VQBAMzV58mQNGjRIHTp0UGFhoZ555hmVlJRo5MiRstlsSk5OVlpamqKiohQVFaW0tDT5+flp2LBhkqSgoCCNGjVKkyZNUkhIiIKDgzV58mTrUksAAAAALVO9N8L++Mc/6oknntA999wjSerWrZv27dun9PR0jRw50umSlbCwMOt957ocJSUlRRMnTrRel5SUcINiAHBjBw8e1L333qsff/xRbdu21XXXXafPP/9cHTt2lCRNmTJFZWVlGjNmjIqKitSrVy+tXbtWAQEB1mfMmTNHnp6eGjp0qMrKytSnTx8tWbJEHh4erpoWAAAAgAZW75dGHj9+XBdd5PyxHh4eOnXqlCTV6JKVM3FPFgDAr2VmZur7779XRUWFDh06pLfeektdu3a11ttsNqWmpio/P18///yzcnJyFB0d7fQZPj4+mjt3rg4fPqzjx4/r3Xff5Y8sAIBa+eSTTzRo0CCFh4fLZrPp7bffdlr/wAMPyGazOS3XXXedU0x5ebnGjx+vNm3ayN/fX4MHD9bBgwcbcRYA4F7qvRE2aNAgPfvss3r//fe1d+9eZWVlafbs2br99tslyemSlaysLG3btk0PPPCA0yUrAAAAANDUHTt2TD169NC8efOqjfnd736n/Px8a/nggw+c1icnJysrK0uZmZnasGGDjh49qqSk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Y6TdaJrjdxLOz52Oi+riQo6lWrr6OM5yF/VxLNbS1cdx2oVwi0aYt7e3YmJilJ2d7TSenZ2tuLg4F2VVv4wxGjdunFauXKmPPvpIkZGRTusjIyPlcDic9kFFRYVycnKsfRATEyMvLy+nmPz8fG3btq3Z7Kc+ffpo69at2rJli7XExsZq+PDh2rJlizp37uwW+6F3795VHvm8a9cudezYUZL7/DwcP35cF13k/DXn4eFhPZbXXfYDGl9d6s71119fJX7t2rWKjY2Vl5dXg+V6IepaX1977TU98MADWrFiRbO5t1Jt5xoYGFilHj3yyCO6/PLLtWXLFvXq1auxUq+1uvy79u7dW99//72OHj1qje3atUsXXXSR08FkU1KXeVZXV6T/ni3VUjTH7yScnzscF9VFfRxLtXT1cZzlLurjWKylq4/jtAtywbfbbyZOPyZ40aJFZseOHSY5Odn4+/ubvXv3ujq1evE///M/JigoyHz88ccmPz/fWo4fP27FzJgxwwQFBZmVK1earVu3mnvvvbfK40cfeeQR0759e7Nu3TrzxRdfmJtvvtn06NHDnDx50hXTqhe/fpqJMe6xHzZt2mQ8PT3Ns88+a7799luzfPly4+fnZ5YtW2bFuMN+GDlypLnkkkusx/KuXLnStGnTxkyZMsWKcYf9ANc4X9154oknzH333WfF79692/j5+ZnHHnvM7NixwyxatMh4eXmZN99801VTqJHaznPFihXG09PTvPDCC0716siRI66aQo3Vdq5nak5PjaztXEtLS0379u3NnXfeabZv325ycnJMVFSU+f3vf++qKdRIbee5ePFi4+npaV588UXzf//3f2bDhg0mNjbWXHvtta6aQo2VlpaaL7/80nz55ZdGkpk9e7b58ssvzb59+4wxLec7CefX0o+L6qK+jqXcTV2Os9xBfR2LtWT1dZxWV27TCDPGmBdeeMF07NjReHt7m6uvvtp6HG5LIOmsy+LFi62YU6dOmaeffto4HA5jt9vNb3/7W7N161anzykrKzPjxo0zwcHBxtfX1yQlJZn9+/c38mzq15lf0O6yH959910THR1t7Ha76dKli1mwYIHTenfYDyUlJWbChAmmQ4cOxsfHx3Tu3NlMnTrVlJeXWzHusB/gOueqOyNHjjTx8fFO8R9//LHp2bOn8fb2Np06dTLz589v5IzrpjbzjI+PP2u9GjlyZOMnXge1/Tf9tebUCDOm9nP95ptvTN++fY2vr69p3769mThxotNBZFNV23k+//zzpmvXrsbX19eEhYWZ4cOHm4MHDzZy1rW3fv36c/6/15K+k3B+Lfm4qC7q61jK3dTlOMtd1MexWEtWX8dpdWUzpoWdxw0AAAAAAACchVvcIwwAAAAAAACgEQYAAAAAAAC3QCMMAAAAAAAAboFGGAAAAAAAANwCjTAAAAAAAAC4BRphAAAAAAAAcAs0wgAAAAAAAOAWaIQBAAAAAADALdAIAwAAAAAAgFugEQa38O9//1u33367OnToILvdrtDQUF1//fWaNGmSFZOQkKCEhATr9d69e2Wz2fTXv/613rYBAHBvS5Yskc1msxZPT0+1b99eDz74oA4dOtRoeXz88cey2Wx68803G22bAICm78w69etl8uTJrk4PqBeerk4AaGjvv/++Bg8erISEBM2cOVNhYWHKz8/X5s2blZmZqVmzZkmSXnzxxQbfBgAAkrR48WJ16dJFZWVl+uSTT5Senq6cnBxt3bpV/v7+rk4PAODmTtepXwsPD3dRNkD9ohGGFm/mzJmKjIzUhx9+KE/P//7I33PPPZo5c6b1umvXrg2+DQAAJCk6OlqxsbGSpJtuukmVlZX685//rLffflvDhw+v8+eWlZXJ19e3vtIEALipX9ep+nDixAnrTGjA1bg0Ei3e4cOH1aZNm7N+6V500X//Fzjz0sjTTp06pWeffVYdOnSQj4+PYmNj9c9//rNO25CkTp06KSkpSVlZWerevbt8fHzUuXNnPf/883WcIQCgubvuuuskSfv27dO0adPUq1cvBQcHKzAwUFdffbUWLVokY4zTe07Xk5UrV6pnz57y8fHRtGnTJEmHDh3SH/7wB0VERMjb21vh4eG688479cMPPzh9xokTJzR16lSFh4crMDBQffv21c6dOxtn0gCAZuW7777Tgw8+qKioKPn5+emSSy7RoEGDtHXrVqe405ffv/rqq5o0aZIuueQS2e12fffdd5KkdevWqU+fPgoMDJSfn5969+5d5fgKaEg0wtDiXX/99fr3v/+tRx99VP/+97914sSJWr1/3rx5WrNmjTIyMrRs2TJddNFFGjBggD777LM6b2PLli1KTk7WY489pqysLMXFxWnChAk1vh8ZAKBlOX1w0LZtW+3du1ejR4/WG2+8oZUrV2rIkCEaP368/vznP1d53xdffKE//vGPevTRR7VmzRrdcccdOnTokK655hplZWVp4sSJWr16tTIyMhQUFKSioiKn9z/55JPat2+f/v73v2vBggX69ttvNWjQIFVWVjbKvAEATVNlZaVOnjzptHz//fcKCQnRjBkztGbNGr3wwgvy9PRUr169zvpHlJSUFO3fv18vvfSS3n33XbVr107Lli1TYmKiAgMDtXTpUr3xxhsKDg5W//79aYah8Righfvxxx/NDTfcYCQZScbLy8vExcWZ9PR0U1paasXFx8eb+Ph46/WePXuMJBMeHm7Kysqs8ZKSEhMcHGz69u1b620YY0zHjh2NzWYzW7ZscRrv16+fCQwMNMeOHavnPQAAaCoWL15sJJnPP//cnDhxwpSWlpr33nvPtG3b1gQEBJiCggKn+MrKSnPixAkzffp0ExISYk6dOmWt69ixo/Hw8DA7d+50es9DDz1kvLy8zI4dO6rNY/369UaSueWWW5zG33jjDSPJfPbZZ/UwWwBAc3O6Tp1tOXHihFPsyZMnTUVFhYmKijKPPfaYNX66xvz2t791ij927JgJDg42gwYNchqvrKw0PXr0MNdee23DTQz4Fc4IQ4sXEhKiTz/9VLm5uZoxY4ZuvfVW7dq1SykpKerWrZt+/PHHc75/yJAh8vHxsV4HBARo0KBB+uSTT6y/mNd2G1deeaV69OjhNDZs2DCVlJToiy++qKeZAwCaquuuu05eXl4KCAhQUlKSHA6HVq9erdDQUH300Ufq27evgoKC5OHhIS8vL/3pT3/S4cOHVVhY6PQ53bt312WXXeY0tnr1at1000264oorzpvH4MGDq3ye9MslmgAA9/XKK68oNzfXaZGktLQ0de3aVd7e3vL09JS3t7e+/fZbffPNN1U+44477nB6vXHjRv30008aOXKk05lmp06d0u9+9zvl5ubq2LFjjTI/uDfuVAe3ERsba93w8cSJE3r88cc1Z84czZw585w3tHc4HGcdq6io0NGjRxUUFFTrbVT3mdIv9xsDALRsr7zyiq644gp5enoqNDRUYWFhkqRNmzYpMTFRCQkJWrhwodq3by9vb2+9/fbbevbZZ1VWVub0Oaff92v/+c9/1L59+xrlERIS4vTabrdLUpXtAADcyxVXXFHlZvmPPvqoXnjhBT3++OOKj49X69atddFFF+n3v//9WevGmTXq9H0q77zzzmq3+9NPP/H0ZDQ4GmFwS15eXnr66ac1Z84cbdu27ZyxBQUFZx3z9vZWq1at6rSN6j5TqnpQAgBoec52gCFJmZmZ8vLy0nvvved0NvLbb7991s+x2WxVxtq2bauDBw/WW64AAEjSsmXLdP/99ystLc1p/Mcff9TFF19cJf7MGtWmTRtJ0ty5c62HxJwpNDS0fpIFzoFLI9Hi5efnn3X89Om74eHh53z/ypUr9fPPP1uvS0tL9e677+rGG2+Uh4dHnbaxfft2ffXVV05jK1asUEBAgK6++upz5gMAaLlOP1r+dH2Rfjk769VXX63xZwwYMEDr16/n6Y8AgHpls9msM4dPe//993Xo0KEavb937966+OKLtWPHDutKmjMXb2/vhkgdcMIZYWjx+vfvr/bt22vQoEHq0qWLTp06pS1btmjWrFlq1aqVJkyYcM73e3h4qF+/fpo4caJOnTql5557TiUlJdYj6uuyjfDwcA0ePFipqakKCwvTsmXLlJ2dreeee05+fn4Nsh8AAE3fwIEDNXv2bA0bNkx/+MMfdPjwYf31r3+tcuBxLtOnT9fq1av129/+Vk8++aS6deumI0eOaM2aNZo4caK6dOnSgDMAALRUSUlJWrJkibp06aLu3bsrLy9Pf/nLX2p8OX6rVq00d+5cjRw5Uj/99JPuvPNOtWvXTv/5z3/01Vdf6T//+Y/mz5/fwLMAaITBDTz11FN65513NGfOHOXn56u8vFxhYWHq27evUlJSznsz4XHjxunnn3/Wo48+qsLCQl155ZV6//331bt37zpv46qrrtKDDz6op59+Wt9++63Cw8M1e/ZsPfbYYw2yDwAAzcPNN9+sl19+Wc8995wGDRqkSy65RA8//LDatWunUaNG1egzLrnkEm3atElPP/20ZsyYocOHD6tt27a64YYbFBwc3MAzAAC0VH/729/k5eWl9PR0HT16VFdffbVWrlypp556qsafMWLECHXo0EEzZ87U6NGjVVpaqnbt2umqq67SAw880HDJA79iM8YYVycBuJNOnTopOjpa7733nqtTAQAAAADArXCPMAAAAAAAALgFGmEAAAAAAABwC1waCQAAAAAAALfAGWEAAAAAAABwCzTCAAAAAAAA4BZohAEAAAAAAMAt0AgDAAAAAACAW/B0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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df.hist(figsize = (15, 8), grid = False);" ] }, { "cell_type": "markdown", "id": "04f77318", "metadata": {}, "source": [ "### Exporting a file" ] }, { "cell_type": "markdown", "id": "180bbfed", "metadata": {}, "source": [ "**`csv` format**" ] }, { "cell_type": "code", "execution_count": 228, "id": "fd982201", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The csv file is exported to C:\\Users\\vkoul\\Desktop\\DA_Training_book\\pythonbook\n" ] } ], "source": [ "df.to_csv(\"Titanic_modified_Python_processed.csv\", index = False)\n", "\n", "print(\"The csv file is exported to {}\".format(os.getcwd()))" ] }, { "cell_type": "markdown", "id": "88a54619", "metadata": {}, "source": [ "**`xlsx` format**" ] }, { "cell_type": "code", "execution_count": 229, "id": "ac0e8a3a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The csv file is exported to C:\\Users\\vkoul\\Desktop\\DA_Training_book\\pythonbook\n" ] } ], "source": [ "df.to_excel(\"Titanic_modified_Python_processed.xlsx\", index = False)\n", "\n", "print(\"The csv file is exported to {}\".format(os.getcwd()))" ] }, { "cell_type": "markdown", "id": "daf021ed", "metadata": {}, "source": [ "```{tip}\n", "**Best Way to learn Pandas is to download datasets, prepare a list of questions and answer those questions using Pandas**\n", " \n", "**[Kaggle Datasets](https://www.kaggle.com/datasets) is a good website to get relevant website**\n", "```" ] }, { "cell_type": "markdown", "id": "ab9645ec", "metadata": {}, "source": [ "## πŸ“š Reference material \n", "\n", "**Pandas**\n", "* [**Pandas Exercises**](https://github.com/guipsamora/pandas_exercises) - Highly recommend\n", "* [Community tutorials](https://pandas.pydata.org/docs/getting_started/tutorials.html) - very useful\n", "* [40 Examples to Master Pandas](https://towardsdatascience.com/40-examples-to-master-pandas-c69d058f434e)- very useful\n", "* [Pandas CookBook](https://github.com/jvns/pandas-cookbook)- Good reference\n", "* [Modern Pandas](http://tomaugspurger.github.io/modern-1-intro.html) - Good Reference\n", " \n", "* **[10 mins pandas](https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html)** - Definitely check this out to get a quick introduction to pandas\n", "\n", "* **[Data Manipulation with Pandas](https://jakevdp.github.io/PythonDataScienceHandbook/03.00-introduction-to-pandas.html)**\n", "\n", " \n", " \n", " \n", "**Pandas Documentation**\n", "\n", "* [Pandas Missing Value Documentation](https://pandas.pydata.org/pandas-docs/dev/user_guide/missing_data.html#) \n", "* [Handling Missing data](https://jakevdp.github.io/PythonDataScienceHandbook/03.04-missing-values.html)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.13" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "384px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 5 }