Created
April 4, 2018 23:31
-
-
Save malcolmgreaves/2c7fbc94de116d62383ef6cc2e3ebdd0 to your computer and use it in GitHub Desktop.
Pandas Dataframe Basics, from https://nbviewer.jupyter.org/github/groverpr/learn_python_libraries/blob/master/pandas/pandas_cheatsheet.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"../images/pddf.jpg\" alt=\"Drawing\" style=\"width: 600px;\"/>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np # necessity as pandas is built on np\n", | |
"from IPython.display import Image # to display images " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The Pandas library is built on NumPy and provides easy-to-use data structures and data analysis tools for the Python programming language. \n", | |
" \n", | |
"Refer to these cheatsheets: \n", | |
"https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PandasPythonForDataScience+(1).pdf\n", | |
"https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Python_Pandas_Cheat_Sheet_2.pdf" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Input/Output\n", | |
"Different types of data can be loaded in pandas dataframe. Pandas dataframe is like looks spreadsheet table (just a rough analogy)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* **Most common input types**\n", | |
" * `pd.read_csv`\n", | |
" * `pd.read_excel/ pd.ExcelFile`\n", | |
" * `pd.read_feather` (feather format is used to reduce memory load in df as data is saved in binary form)\n", | |
" * `pd.read_json`\n", | |
" * `pd.read_html`\n", | |
" * `pd.read_pickle` (can also infer if pickled object is zipped using infer=)\n", | |
" \n", | |
"* **Output types have format `to_xxx` similar to input formats**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Pandas data structures" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"** Pandas data strctures include `series` and `dataframe` **" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**Series**: A one-dimensional labeled array a capable of holding any data type " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": { | |
"image/png": { | |
"width": 500 | |
} | |
}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Image('../images/series.png', width=500) # not pandas, just showing example series" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# index will set the index for further reference\n", | |
"# data can be passed as list\n", | |
"s = pd.Series([3, -5, 7, 4], index=['a', 'b', 'c', 'd']) " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"a 3\n", | |
"b -5\n", | |
"c 7\n", | |
"d 4\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**Can be indexed using both index name or number.** \n", | |
"number: --> filter indexes after value of number \n", | |
":number --> filter indexes before value of number " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"b -5\n", | |
"c 7\n", | |
"d 4\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 42, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s[1:]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"3" | |
] | |
}, | |
"execution_count": 46, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s['a'] " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 47, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"a 3\n", | |
"b -5\n", | |
"c 7\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 47, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s[:'c']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 50, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Index(['a', 'b', 'c', 'd'], dtype='object')" | |
] | |
}, | |
"execution_count": 50, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s.index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"a 3\n", | |
"b -1\n", | |
"c 12\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# series using dictionary\n", | |
"\n", | |
"s2 = pd.Series({'a':3, 'b': -1, 'c': 12}); s2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"-1" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"s2['b']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**Dataframe**: A two-dimensional labeled data structure with columns of potentially different types. It is similar to excel table. \n", | |
"\n", | |
"Can make data frame using dictionary, list of list" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"execution_count": 25, | |
"metadata": { | |
"image/png": { | |
"width": 500 | |
} | |
}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Image('../images/df.png', width=500) " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 288, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"data = {'Country': ['Belgium', 'India', 'Brazil'],\n", | |
" 'Capital': ['Brussels', 'New Delhi', 'Brasília'],\n", | |
" 'Population': [11190846, 1303171035, 207847528]}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 289, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_sample = pd.DataFrame(data,\n", | |
" columns=['Country', 'Capital', 'Population'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 290, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Country</th>\n", | |
" <th>Capital</th>\n", | |
" <th>Population</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Belgium</td>\n", | |
" <td>Brussels</td>\n", | |
" <td>11190846</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>India</td>\n", | |
" <td>New Delhi</td>\n", | |
" <td>1303171035</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Brazil</td>\n", | |
" <td>Brasília</td>\n", | |
" <td>207847528</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Country Capital Population\n", | |
"0 Belgium Brussels 11190846\n", | |
"1 India New Delhi 1303171035\n", | |
"2 Brazil Brasília 207847528" | |
] | |
}, | |
"execution_count": 290, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_sample" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Common dataframe functionality" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Using famous `titanic data` for analysis and exploration. \n", | |
"https://www.kaggle.com/c/titanic/data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"../images/titanic.jpg\" style=\"width: 600px;\"/>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* **Common things to do when we get data in a dataframe (examples shown below):** \n", | |
" * see dataframe shape (number of rows, number of columns) using `df.shape`\n", | |
" * see top 5 rows using `pd.head()`\n", | |
" * check datatype of each column using `pd.dtypes`\n", | |
" * check column names using `pd.columns`\n", | |
" * count unique values of each column to see cardinality levels using `pd.nunique()`\n", | |
" * number of non null in each column, memory usage of df, datatype (especially for large df) using `pd.info()`\n", | |
" \n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df = pd.read_csv('../data/train.csv') # read csv file" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(891, 12)" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>26.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>7.9250</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>4</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n", | |
" <td>female</td>\n", | |
" <td>35.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>113803</td>\n", | |
" <td>53.1000</td>\n", | |
" <td>C123</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>5</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Allen, Mr. William Henry</td>\n", | |
" <td>male</td>\n", | |
" <td>35.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>373450</td>\n", | |
" <td>8.0500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"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": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.head() # see top 5 rows of data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"PassengerId int64\n", | |
"Survived int64\n", | |
"Pclass int64\n", | |
"Name object\n", | |
"Sex object\n", | |
"Age float64\n", | |
"SibSp int64\n", | |
"Parch int64\n", | |
"Ticket object\n", | |
"Fare float64\n", | |
"Cabin object\n", | |
"Embarked object\n", | |
"dtype: object" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.dtypes # see datatype of each variable" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',\n", | |
" 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],\n", | |
" dtype='object')" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.columns # column names" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"PassengerId 891\n", | |
"Survived 2\n", | |
"Pclass 3\n", | |
"Name 891\n", | |
"Sex 2\n", | |
"Age 88\n", | |
"SibSp 7\n", | |
"Parch 7\n", | |
"Ticket 681\n", | |
"Fare 248\n", | |
"Cabin 147\n", | |
"Embarked 3\n", | |
"dtype: int64" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.nunique() # unique value for each variable" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<class 'pandas.core.frame.DataFrame'>\n", | |
"RangeIndex: 891 entries, 0 to 890\n", | |
"Data columns (total 12 columns):\n", | |
"PassengerId 891 non-null int64\n", | |
"Survived 891 non-null int64\n", | |
"Pclass 891 non-null int64\n", | |
"Name 891 non-null object\n", | |
"Sex 891 non-null object\n", | |
"Age 714 non-null float64\n", | |
"SibSp 891 non-null int64\n", | |
"Parch 891 non-null int64\n", | |
"Ticket 891 non-null object\n", | |
"Fare 891 non-null float64\n", | |
"Cabin 204 non-null object\n", | |
"Embarked 889 non-null object\n", | |
"dtypes: float64(2), int64(5), object(5)\n", | |
"memory usage: 83.6+ KB\n" | |
] | |
} | |
], | |
"source": [ | |
"df.info() # not null part is very useful to see how many nulls are there in data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Advanced Indexing" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `iloc` \n", | |
"Select based on integer location (**that's why i**). Can select single or multiple" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 56, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'male'" | |
] | |
}, | |
"execution_count": 56, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.iloc[0, 4] # 0 row, 4 column" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>26.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1</td>\n", | |
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n", | |
" <td>female</td>\n", | |
" <td>35.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Pclass Name Sex Age\n", | |
"1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0\n", | |
"2 3 Heikkinen, Miss. Laina female 26.0\n", | |
"3 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0" | |
] | |
}, | |
"execution_count": 58, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.iloc[1:4, 2:6] # indexes are maintained. Can reset_index() to start index from 0 " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `loc`\n", | |
"Select based on label name of column (can select single or multiple)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 63, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>26.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name Sex Age\n", | |
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0\n", | |
"2 Heikkinen, Miss. Laina female 26.0" | |
] | |
}, | |
"execution_count": 63, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.loc[1:2,'Name':\"Age\"] # here row indexes are numbers but column indexes are name of columns " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Name Heikkinen, Miss. Laina\n", | |
"Age 26\n", | |
"Name: 2, dtype: object" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.loc[2,['Name',\"Age\"]] # here row indexes are numbers. " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `ix`\n", | |
"ix has been deprecated in latest pandas library. It was used to select by label or position. But we can always use `loc` to select with labels and `iloc` to select with integers/position" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `Boolean indexing`\n", | |
"Returns rows where the stated condition returns true\n", | |
"\n", | |
"* or -> condition 1 `|` condition 2 (`or` also works but throws ambiguity error for multiple conditions)\n", | |
"* and -> condition 1 `&` condition 2 (`and` also works but throws ambiguity error for multiple conditions\n", | |
"* not -> `~` (not condition)\n", | |
"* equal -> `==` Satisfying condition \n", | |
"* `any()` -> columns/rows with any value matching condition\n", | |
"* `all()` > columns/rows with all values matching some condition" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>26.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>7.9250</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>4</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n", | |
" <td>female</td>\n", | |
" <td>35.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>113803</td>\n", | |
" <td>53.1000</td>\n", | |
" <td>C123</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"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": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# select rows with either sex as female or Pclass as 1\n", | |
"df[(df.Sex == 'female') | (df.iloc[:,2] == 1) ].iloc[:3] # () are important" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 63, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name Sex \\\n", | |
"0 Braund, Mr. Owen Harris male \n", | |
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female \n", | |
"2 Heikkinen, Miss. Laina female \n", | |
"\n", | |
" Ticket Cabin Embarked \n", | |
"0 A/5 21171 NaN S \n", | |
"1 PC 17599 C85 C \n", | |
"2 STON/O2. 3101282 NaN S " | |
] | |
}, | |
"execution_count": 63, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# first 3 rows of gives all columns which have all string values or all int > 1 values\n", | |
"df.loc[:,(df > 1).all()][:3] " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.2500</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>7.9250</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass \\\n", | |
"0 1 0 3 \n", | |
"1 2 1 1 \n", | |
"2 3 1 3 \n", | |
"\n", | |
" Name Sex SibSp Parch \\\n", | |
"0 Braund, Mr. Owen Harris male 1 0 \n", | |
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 1 0 \n", | |
"2 Heikkinen, Miss. Laina female 0 0 \n", | |
"\n", | |
" Ticket Fare \n", | |
"0 A/5 21171 7.2500 \n", | |
"1 PC 17599 71.2833 \n", | |
"2 STON/O2. 3101282 7.9250 " | |
] | |
}, | |
"execution_count": 65, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# first 3 rows of all columns which have all not null values\n", | |
"df.loc[:,(df.notnull().all() )][:3]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 67, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Age</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>22.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>38.0</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>26.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Age Cabin Embarked\n", | |
"0 22.0 NaN S\n", | |
"1 38.0 C85 C\n", | |
"2 26.0 NaN S" | |
] | |
}, | |
"execution_count": 67, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# first 3 rows of all columns which have atleast 1 null value\n", | |
"df.loc[:, df.isnull().any()][:3]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(94, 12)" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[(df.iloc[:,2] == 1) & (df.Sex == 'female')].shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.3075196408529742" | |
] | |
}, | |
"execution_count": 39, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# fraction of males with Age > 25, df.shape[0] -> number of rows \n", | |
"\n", | |
"sum((df.Age > 25) & (df.Sex == 'male'))/df.shape[0] " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 50, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"223" | |
] | |
}, | |
"execution_count": 50, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# number of people who survived and were not in class 3\n", | |
"\n", | |
"sum((df.Survived != 0) & (~(df.Pclass == 3)) ) " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `querying`\n", | |
"Query columns (filter rows) of dataframe with boolean expression (Filter based on condition)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 75, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>26.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>7.9250</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>4</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n", | |
" <td>female</td>\n", | |
" <td>35.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>113803</td>\n", | |
" <td>53.1000</td>\n", | |
" <td>C123</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>5</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Allen, Mr. William Henry</td>\n", | |
" <td>male</td>\n", | |
" <td>35.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>373450</td>\n", | |
" <td>8.0500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>7</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>McCarthy, Mr. Timothy J</td>\n", | |
" <td>male</td>\n", | |
" <td>54.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>17463</td>\n", | |
" <td>51.8625</td>\n", | |
" <td>E46</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>9</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)</td>\n", | |
" <td>female</td>\n", | |
" <td>27.0</td>\n", | |
" <td>0</td>\n", | |
" <td>2</td>\n", | |
" <td>347742</td>\n", | |
" <td>11.1333</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9</th>\n", | |
" <td>10</td>\n", | |
" <td>1</td>\n", | |
" <td>2</td>\n", | |
" <td>Nasser, Mrs. Nicholas (Adele Achem)</td>\n", | |
" <td>female</td>\n", | |
" <td>14.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>237736</td>\n", | |
" <td>30.0708</td>\n", | |
" <td>NaN</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>11</th>\n", | |
" <td>12</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Bonnell, Miss. Elizabeth</td>\n", | |
" <td>female</td>\n", | |
" <td>58.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>113783</td>\n", | |
" <td>26.5500</td>\n", | |
" <td>C103</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>12</th>\n", | |
" <td>13</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Saundercock, Mr. William Henry</td>\n", | |
" <td>male</td>\n", | |
" <td>20.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5. 2151</td>\n", | |
" <td>8.0500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>13</th>\n", | |
" <td>14</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Andersson, Mr. Anders Johan</td>\n", | |
" <td>male</td>\n", | |
" <td>39.0</td>\n", | |
" <td>1</td>\n", | |
" <td>5</td>\n", | |
" <td>347082</td>\n", | |
" <td>31.2750</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>15</th>\n", | |
" <td>16</td>\n", | |
" <td>1</td>\n", | |
" <td>2</td>\n", | |
" <td>Hewlett, Mrs. (Mary D Kingcome)</td>\n", | |
" <td>female</td>\n", | |
" <td>55.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>248706</td>\n", | |
" <td>16.0000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>18</th>\n", | |
" <td>19</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Vander Planke, Mrs. Julius (Emelia Maria Vande...</td>\n", | |
" <td>female</td>\n", | |
" <td>31.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>345763</td>\n", | |
" <td>18.0000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>20</th>\n", | |
" <td>21</td>\n", | |
" <td>0</td>\n", | |
" <td>2</td>\n", | |
" <td>Fynney, Mr. Joseph J</td>\n", | |
" <td>male</td>\n", | |
" <td>35.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>239865</td>\n", | |
" <td>26.0000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>21</th>\n", | |
" <td>22</td>\n", | |
" <td>1</td>\n", | |
" <td>2</td>\n", | |
" <td>Beesley, Mr. Lawrence</td>\n", | |
" <td>male</td>\n", | |
" <td>34.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>248698</td>\n", | |
" <td>13.0000</td>\n", | |
" <td>D56</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>23</th>\n", | |
" <td>24</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Sloper, Mr. William Thompson</td>\n", | |
" <td>male</td>\n", | |
" <td>28.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>113788</td>\n", | |
" <td>35.5000</td>\n", | |
" <td>A6</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25</th>\n", | |
" <td>26</td>\n", | |
" <td>1</td>\n", | |
" <td>3</td>\n", | |
" <td>Asplund, Mrs. Carl Oscar (Selma Augusta Emilia...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>5</td>\n", | |
" <td>347077</td>\n", | |
" <td>31.3875</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>30</th>\n", | |
" <td>31</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>Uruchurtu, Don. Manuel E</td>\n", | |
" <td>male</td>\n", | |
" <td>40.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17601</td>\n", | |
" <td>27.7208</td>\n", | |
" <td>NaN</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>33</th>\n", | |
" <td>34</td>\n", | |
" <td>0</td>\n", | |
" <td>2</td>\n", | |
" <td>Wheadon, Mr. Edward H</td>\n", | |
" <td>male</td>\n", | |
" <td>66.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>C.A. 24579</td>\n", | |
" <td>10.5000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>35</th>\n", | |
" <td>36</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>Holverson, Mr. Alexander Oskar</td>\n", | |
" <td>male</td>\n", | |
" <td>42.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>113789</td>\n", | |
" <td>52.0000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>54</th>\n", | |
" <td>55</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>Ostby, Mr. Engelhart Cornelius</td>\n", | |
" <td>male</td>\n", | |
" <td>65.0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>113509</td>\n", | |
" <td>61.9792</td>\n", | |
" <td>B30</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"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", | |
"6 7 0 1 \n", | |
"8 9 1 3 \n", | |
"9 10 1 2 \n", | |
"11 12 1 1 \n", | |
"12 13 0 3 \n", | |
"13 14 0 3 \n", | |
"15 16 1 2 \n", | |
"18 19 0 3 \n", | |
"20 21 0 2 \n", | |
"21 22 1 2 \n", | |
"23 24 1 1 \n", | |
"25 26 1 3 \n", | |
"30 31 0 1 \n", | |
"33 34 0 2 \n", | |
"35 36 0 1 \n", | |
"54 55 0 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", | |
"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", | |
"6 McCarthy, Mr. Timothy J male 54.0 0 \n", | |
"8 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 \n", | |
"9 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 1 \n", | |
"11 Bonnell, Miss. Elizabeth female 58.0 0 \n", | |
"12 Saundercock, Mr. William Henry male 20.0 0 \n", | |
"13 Andersson, Mr. Anders Johan male 39.0 1 \n", | |
"15 Hewlett, Mrs. (Mary D Kingcome) female 55.0 0 \n", | |
"18 Vander Planke, Mrs. Julius (Emelia Maria Vande... female 31.0 1 \n", | |
"20 Fynney, Mr. Joseph J male 35.0 0 \n", | |
"21 Beesley, Mr. Lawrence male 34.0 0 \n", | |
"23 Sloper, Mr. William Thompson male 28.0 0 \n", | |
"25 Asplund, Mrs. Carl Oscar (Selma Augusta Emilia... female 38.0 1 \n", | |
"30 Uruchurtu, Don. Manuel E male 40.0 0 \n", | |
"33 Wheadon, Mr. Edward H male 66.0 0 \n", | |
"35 Holverson, Mr. Alexander Oskar male 42.0 1 \n", | |
"54 Ostby, Mr. Engelhart Cornelius male 65.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 \n", | |
"6 0 17463 51.8625 E46 S \n", | |
"8 2 347742 11.1333 NaN S \n", | |
"9 0 237736 30.0708 NaN C \n", | |
"11 0 113783 26.5500 C103 S \n", | |
"12 0 A/5. 2151 8.0500 NaN S \n", | |
"13 5 347082 31.2750 NaN S \n", | |
"15 0 248706 16.0000 NaN S \n", | |
"18 0 345763 18.0000 NaN S \n", | |
"20 0 239865 26.0000 NaN S \n", | |
"21 0 248698 13.0000 D56 S \n", | |
"23 0 113788 35.5000 A6 S \n", | |
"25 5 347077 31.3875 NaN S \n", | |
"30 0 PC 17601 27.7208 NaN C \n", | |
"33 0 C.A. 24579 10.5000 NaN S \n", | |
"35 0 113789 52.0000 NaN S \n", | |
"54 1 113509 61.9792 B30 C " | |
] | |
}, | |
"execution_count": 75, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# filter all rows which have Age > Passenger ID\n", | |
"df.query('Age > PassengerId')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Setting/ Resetting Index\n", | |
"Setting and resetting index are important when we merge/groupby 2 dataframe and want to do further analysis on new dataframe. A dataframe with repeated indexes can cause problems in filtering. Apart from this we cvan set a column into index which makes merging much faster" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `set_index()`\n", | |
"Set any column you want as index of df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 76, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Ticket</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>A/5 21171</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>PC 17599</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass \\\n", | |
"Ticket \n", | |
"A/5 21171 1 0 3 \n", | |
"PC 17599 2 1 1 \n", | |
"\n", | |
" Name Sex Age \\\n", | |
"Ticket \n", | |
"A/5 21171 Braund, Mr. Owen Harris male 22.0 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 \n", | |
"\n", | |
" SibSp Parch Fare Cabin Embarked \n", | |
"Ticket \n", | |
"A/5 21171 1 0 7.2500 NaN S \n", | |
"PC 17599 1 0 71.2833 C85 C " | |
] | |
}, | |
"execution_count": 76, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# setting \n", | |
"df.set_index('Ticket')[:2]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Ticket</th>\n", | |
" <th>Name</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>A/5 21171</th>\n", | |
" <th>Braund, Mr. Owen Harris</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>PC 17599</th>\n", | |
" <th>Cumings, Mrs. John Bradley (Florence Briggs Thayer)</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 1 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 2 \n", | |
"\n", | |
" Survived \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 0 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 1 \n", | |
"\n", | |
" Pclass Sex \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 3 male \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 1 female \n", | |
"\n", | |
" Age SibSp \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 22.0 1 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 38.0 1 \n", | |
"\n", | |
" Parch Fare \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 0 7.2500 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 0 71.2833 \n", | |
"\n", | |
" Cabin Embarked \n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris NaN S \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... C85 C " | |
] | |
}, | |
"execution_count": 77, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can set multiple columns as index also. Just pass them in list\n", | |
"# Setting Ticket and Name as index\n", | |
"\n", | |
"df.set_index(['Ticket', 'Name'])[:2]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 90, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"('A/5 21171', 'Braund, Mr. Owen Harris')" | |
] | |
}, | |
"execution_count": 90, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can see what are values of index. \n", | |
"# checking index of 1st row\n", | |
"\n", | |
"df.set_index(['Ticket', 'Name']).index[0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `reset_index()`\n", | |
"Can reset index back to 0....nrows-1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 91, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_index = df.set_index(['Ticket', 'Name'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 92, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Ticket</th>\n", | |
" <th>Name</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>A/5 21171</th>\n", | |
" <th>Braund, Mr. Owen Harris</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>PC 17599</th>\n", | |
" <th>Cumings, Mrs. John Bradley (Florence Briggs Thayer)</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 1 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 2 \n", | |
"\n", | |
" Survived \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 0 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 1 \n", | |
"\n", | |
" Pclass Sex \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 3 male \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 1 female \n", | |
"\n", | |
" Age SibSp \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 22.0 1 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 38.0 1 \n", | |
"\n", | |
" Parch Fare \\\n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris 0 7.2500 \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... 0 71.2833 \n", | |
"\n", | |
" Cabin Embarked \n", | |
"Ticket Name \n", | |
"A/5 21171 Braund, Mr. Owen Harris NaN S \n", | |
"PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Tha... C85 C " | |
] | |
}, | |
"execution_count": 92, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_index[:2]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 93, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Name</th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>PC 17599</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Ticket Name PassengerId \\\n", | |
"0 A/5 21171 Braund, Mr. Owen Harris 1 \n", | |
"1 PC 17599 Cumings, Mrs. John Bradley (Florence Briggs Th... 2 \n", | |
"\n", | |
" Survived Pclass Sex Age SibSp Parch Fare Cabin Embarked \n", | |
"0 0 3 male 22.0 1 0 7.2500 NaN S \n", | |
"1 1 1 female 38.0 1 0 71.2833 C85 C " | |
] | |
}, | |
"execution_count": 93, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_index.reset_index()[:2]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In above case, index is back to 0,1..." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `rename()` \n", | |
"Renaming column names or row indexes of dataframe. Default is index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 94, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Whats_name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Price</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass \\\n", | |
"0 1 0 3 \n", | |
"1 2 1 1 \n", | |
"\n", | |
" Whats_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 Price Cabin Embarked \n", | |
"0 0 A/5 21171 7.2500 NaN S \n", | |
"1 0 PC 17599 71.2833 C85 C " | |
] | |
}, | |
"execution_count": 94, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.rename(columns={'Name': 'Whats_name', 'Fare':'Price'})[:2]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 96, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>passengerid</th>\n", | |
" <th>survived</th>\n", | |
" <th>pclass</th>\n", | |
" <th>name</th>\n", | |
" <th>sex</th>\n", | |
" <th>age</th>\n", | |
" <th>sibsp</th>\n", | |
" <th>parch</th>\n", | |
" <th>ticket</th>\n", | |
" <th>fare</th>\n", | |
" <th>cabin</th>\n", | |
" <th>embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.2500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>38.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>71.2833</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"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": 96, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can use some mapper function also. default axis='index' (0)\n", | |
"\n", | |
"df.rename(mapper=str.lower, axis='columns')[:2]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Duplicated data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `unique()`\n", | |
"Number of unique values in a column of df (Use nunique() for count of unique in each column)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array(['male', 'female'], dtype=object)" | |
] | |
}, | |
"execution_count": 98, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.Sex.unique()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `duplicated()`\n", | |
"Check duplicated in column. Returns True/False" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 102, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0" | |
] | |
}, | |
"execution_count": 102, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"sum(df.PassengerId.duplicated()) # there are no duplicate passegerid. good thing to check" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 115, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0" | |
] | |
}, | |
"execution_count": 115, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can check duplicates in index also.\n", | |
"# useful if doubtful about duplicates in index doing bad things \n", | |
"\n", | |
"sum(df.index.duplicated())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `drop_duplicates`\n", | |
"Drop rows which have duplicates" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 106, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Sex</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>male</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>female</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>female</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>male</td>\n", | |
" <td>Q</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>22</th>\n", | |
" <td>female</td>\n", | |
" <td>Q</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>26</th>\n", | |
" <td>male</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>61</th>\n", | |
" <td>female</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Sex Embarked\n", | |
"0 male S\n", | |
"1 female C\n", | |
"2 female S\n", | |
"5 male Q\n", | |
"22 female Q\n", | |
"26 male C\n", | |
"61 female NaN" | |
] | |
}, | |
"execution_count": 106, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can help in getting unique combination of multiple columns\n", | |
"# unique() dosn't work in this case\n", | |
"df.loc[:,['Sex', 'Embarked']].drop_duplicates()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Grouping data\n", | |
"Group by some column/columns, then we can aggregate to get mean, count, sum or custom function based on the group" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `groupby`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 123, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Sex</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>female</th>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>261</td>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>314</td>\n", | |
" <td>97</td>\n", | |
" <td>312</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>male</th>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>453</td>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>577</td>\n", | |
" <td>107</td>\n", | |
" <td>577</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass Name Age SibSp Parch Ticket Fare \\\n", | |
"Sex \n", | |
"female 314 314 314 314 261 314 314 314 314 \n", | |
"male 577 577 577 577 453 577 577 577 577 \n", | |
"\n", | |
" Cabin Embarked \n", | |
"Sex \n", | |
"female 97 312 \n", | |
"male 107 577 " | |
] | |
}, | |
"execution_count": 123, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# group by sex then count. \n", | |
"# returns count in each column. difference in some cases because of nulls in those columns\n", | |
"# can do iloc[:,0] to only get first column \n", | |
"\n", | |
"df.groupby(by = ['Sex']).count()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 125, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Sex Survived\n", | |
"female 0 25.046875\n", | |
" 1 28.847716\n", | |
"male 0 31.618056\n", | |
" 1 27.276022\n", | |
"Name: Age, dtype: float64" | |
] | |
}, | |
"execution_count": 125, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can use multiple conditions\n", | |
"# group by sex and survived -> mean of age\n", | |
"\n", | |
"df.groupby(by = ['Sex', 'Survived']).mean().loc[:,'Age']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 145, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th>Fare</th>\n", | |
" <th>Age</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Sex</th>\n", | |
" <th>Pclass</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th rowspan=\"3\" valign=\"top\">female</th>\n", | |
" <th>1</th>\n", | |
" <td>106.125798</td>\n", | |
" <td>34.611765</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>21.970121</td>\n", | |
" <td>28.722973</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>16.118810</td>\n", | |
" <td>21.750000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th rowspan=\"3\" valign=\"top\">male</th>\n", | |
" <th>1</th>\n", | |
" <td>67.226127</td>\n", | |
" <td>41.281386</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>19.741782</td>\n", | |
" <td>30.740707</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>12.661633</td>\n", | |
" <td>26.507589</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Fare Age\n", | |
"Sex Pclass \n", | |
"female 1 106.125798 34.611765\n", | |
" 2 21.970121 28.722973\n", | |
" 3 16.118810 21.750000\n", | |
"male 1 67.226127 41.281386\n", | |
" 2 19.741782 30.740707\n", | |
" 3 12.661633 26.507589" | |
] | |
}, | |
"execution_count": 145, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# can group by indexes also by using levels= \n", | |
"# useful when we have multindexes\n", | |
"# can use agg function with lambda func\n", | |
"\n", | |
"df_index = df.set_index(['Sex', 'Pclass'])\n", | |
"df_index.groupby(level=[0,1]).agg({'Fare': lambda x: sum(x)/len(x), # this is also just mean actually\n", | |
" 'Age' : np.mean})" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Interesting! Ticket price of 1st class female is approximately double of 1st class male" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `transform`\n", | |
"Can apply such functions for all columns also using transform which transforms all rows\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 153, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Fare</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Sex</th>\n", | |
" <th>Pclass</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>male</th>\n", | |
" <th>3</th>\n", | |
" <td>455.515850</td>\n", | |
" <td>0.135447</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.498559</td>\n", | |
" <td>0.224784</td>\n", | |
" <td>12.661633</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th rowspan=\"3\" valign=\"top\">female</th>\n", | |
" <th>1</th>\n", | |
" <td>469.212766</td>\n", | |
" <td>0.968085</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.553191</td>\n", | |
" <td>0.457447</td>\n", | |
" <td>106.125798</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>399.729167</td>\n", | |
" <td>0.500000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.895833</td>\n", | |
" <td>0.798611</td>\n", | |
" <td>16.118810</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>469.212766</td>\n", | |
" <td>0.968085</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.553191</td>\n", | |
" <td>0.457447</td>\n", | |
" <td>106.125798</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>male</th>\n", | |
" <th>3</th>\n", | |
" <td>455.515850</td>\n", | |
" <td>0.135447</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0.498559</td>\n", | |
" <td>0.224784</td>\n", | |
" <td>12.661633</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Age SibSp Parch Fare\n", | |
"Sex Pclass \n", | |
"male 3 455.515850 0.135447 NaN 0.498559 0.224784 12.661633\n", | |
"female 1 469.212766 0.968085 NaN 0.553191 0.457447 106.125798\n", | |
" 3 399.729167 0.500000 NaN 0.895833 0.798611 16.118810\n", | |
" 1 469.212766 0.968085 NaN 0.553191 0.457447 106.125798\n", | |
"male 3 455.515850 0.135447 NaN 0.498559 0.224784 12.661633" | |
] | |
}, | |
"execution_count": 153, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# shape of below code is same as original df\n", | |
"\n", | |
"df_index.groupby(level=[0,1]).transform(lambda x: sum(x)/len(x)).head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Handling missing data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `dropna`\n", | |
"Drop rows with na" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 156, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(183, 12)" | |
] | |
}, | |
"execution_count": 156, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# how=any -> row with any column = NA\n", | |
"\n", | |
"df.dropna(axis=0, how='any').shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 159, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(891, 12)" | |
] | |
}, | |
"execution_count": 159, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# how=any -> row with all columns = NA\n", | |
"\n", | |
"df.dropna(axis=0, how='all').shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 167, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[{'Age', 'Cabin', 'Embarked'}]" | |
] | |
}, | |
"execution_count": 167, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# drops column which have any row of NA\n", | |
"\n", | |
"[set(df.columns) - set(df.dropna(axis=1, how='any').columns)]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Three columns have been removed" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `fillna`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 173, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>3</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>22</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>7.25</td>\n", | |
" <td><function mean at 0x10c7d7d90></td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass Name Sex Age SibSp \\\n", | |
"0 1 0 3 Braund, Mr. Owen Harris male 22 1 \n", | |
"\n", | |
" Parch Ticket Fare Cabin Embarked \n", | |
"0 0 A/5 21171 7.25 <function mean at 0x10c7d7d90> S " | |
] | |
}, | |
"execution_count": 173, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# replace with mean of that column\n", | |
"# can put any specific value also\n", | |
"# would not work for columns with string type like Cabin\n", | |
"\n", | |
"df.fillna(np.mean)[:1]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Combining Data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"../images/combine.png\" alt=\"Drawing\" style=\"width: 600px;\"/>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `merge` / `join`\n", | |
"\n", | |
"* **how** = 'left', 'right', 'outer', 'inner'\n", | |
"* **on**\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 182, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"data1 = pd.DataFrame({'x1': list('abc'), 'x2': [11.432, 1.303, 99.906]})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 197, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"data2 = pd.DataFrame({'x1': list('abd'), 'x3': [20.784, np.NaN, 20.784]})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 183, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2\n", | |
"0 a 11.432\n", | |
"1 b 1.303\n", | |
"2 c 99.906" | |
] | |
}, | |
"execution_count": 183, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 198, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>d</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x3\n", | |
"0 a 20.784\n", | |
"1 b NaN\n", | |
"2 d 20.784" | |
] | |
}, | |
"execution_count": 198, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 199, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 x3\n", | |
"0 a 11.432 20.784\n", | |
"1 b 1.303 NaN" | |
] | |
}, | |
"execution_count": 199, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# inner join when both table have that key (like sql)\n", | |
"\n", | |
"data1.merge(data2, how='inner', on='x1')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 200, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>d</td>\n", | |
" <td>NaN</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 x3\n", | |
"0 a 11.432 20.784\n", | |
"1 b 1.303 NaN\n", | |
"2 c 99.906 NaN\n", | |
"3 d NaN 20.784" | |
] | |
}, | |
"execution_count": 200, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# outer joins on all keys in both df and creates NA\n", | |
"\n", | |
"data1.merge(data2, how='outer', on='x1')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"can also use `join` but `merge` is faster. just use merge" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 202, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1L</th>\n", | |
" <th>x2</th>\n", | |
" <th>x1</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1L x2 x1 x3\n", | |
"0 a 11.432 NaN NaN\n", | |
"1 b 1.303 NaN NaN\n", | |
"2 c 99.906 NaN NaN" | |
] | |
}, | |
"execution_count": 202, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# if columns overlap, have to specify suffix as it makes for all\n", | |
"\n", | |
"data1.join(data2, on='x1', how='left', lsuffix='L')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `concatenate`" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 223, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>NaN</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>d</td>\n", | |
" <td>NaN</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>g</td>\n", | |
" <td>NaN</td>\n", | |
" <td>500.000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 x3\n", | |
"0 a 11.432 NaN\n", | |
"1 b 1.303 NaN\n", | |
"2 c 99.906 NaN\n", | |
"0 a NaN 20.784\n", | |
"1 b NaN NaN\n", | |
"2 d NaN 20.784\n", | |
"3 g NaN 500.000" | |
] | |
}, | |
"execution_count": 223, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# join over axis=0, i.e rows combine \n", | |
"# also adds all columns with na\n", | |
"\n", | |
"pd.concat([data1, data2], axis=0)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Notice that it has index duplicates as it maintain original df index" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Can use `ignore_index=True` to make index start from 0" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 211, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>a</td>\n", | |
" <td>NaN</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>b</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>d</td>\n", | |
" <td>NaN</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 x3\n", | |
"0 a 11.432 NaN\n", | |
"1 b 1.303 NaN\n", | |
"2 c 99.906 NaN\n", | |
"3 a NaN 20.784\n", | |
"4 b NaN NaN\n", | |
"5 d NaN 20.784" | |
] | |
}, | |
"execution_count": 211, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pd.concat([data1, data2], axis=0, ignore_index=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 217, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>d</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>g</td>\n", | |
" <td>500.000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x3\n", | |
"0 a 20.784\n", | |
"1 b NaN\n", | |
"2 d 20.784\n", | |
"3 g 500.000" | |
] | |
}, | |
"execution_count": 217, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data2.loc[3] = ['g', 500] # adding new row\n", | |
"data2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 228, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>x1</th>\n", | |
" <th>x3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>a</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>b</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>d</td>\n", | |
" <td>20.784</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>g</td>\n", | |
" <td>500.000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 x1 x3\n", | |
"0 a 11.432 a 20.784\n", | |
"1 b 1.303 b NaN\n", | |
"2 c 99.906 d 20.784\n", | |
"3 NaN NaN g 500.000" | |
] | |
}, | |
"execution_count": 228, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# join over axis=1, i.e columns combine \n", | |
"\n", | |
"pd.concat([data1, data2], axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Date formatting\n", | |
"\n", | |
"* `to_datetime()` -> convert whatever format argument to datetime (obviously that can be parsed to datetime)\n", | |
"* `date_range()` -> generates datetime data\n", | |
"* `Datetimeindex` -> datetypeindex data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 246, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Timestamp('2018-02-19 00:00:00')" | |
] | |
}, | |
"execution_count": 246, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pd.to_datetime('2018-2-19')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 250, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"DatetimeIndex(['2018-04-18', '2018-04-19', '2018-04-20', '2018-04-21',\n", | |
" '2018-04-22', '2018-04-23'],\n", | |
" dtype='datetime64[ns]', freq='D')" | |
] | |
}, | |
"execution_count": 250, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# gives datetimeindex format\n", | |
"\n", | |
"pd.date_range('2018-4-18', periods=6, freq='d')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 235, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"data1['date'] = pd.date_range('2018-4-18', periods=3, freq='d')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 236, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>x1</th>\n", | |
" <th>x2</th>\n", | |
" <th>date</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>a</td>\n", | |
" <td>11.432</td>\n", | |
" <td>2018-04-18</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>b</td>\n", | |
" <td>1.303</td>\n", | |
" <td>2018-04-19</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>c</td>\n", | |
" <td>99.906</td>\n", | |
" <td>2018-04-20</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" x1 x2 date\n", | |
"0 a 11.432 2018-04-18\n", | |
"1 b 1.303 2018-04-19\n", | |
"2 c 99.906 2018-04-20" | |
] | |
}, | |
"execution_count": 236, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 248, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0 2018-04-18\n", | |
"1 2018-04-19\n", | |
"2 2018-04-20\n", | |
"Name: date, dtype: datetime64[ns]" | |
] | |
}, | |
"execution_count": 248, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data1.date" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 247, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"DatetimeIndex(['2018-04-18', '2018-04-19', '2018-04-20'], dtype='datetime64[ns]', name='date', freq=None)" | |
] | |
}, | |
"execution_count": 247, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pd.DatetimeIndex(data1.date)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Reshaping data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `pivot` -> reshape data\n", | |
"Ever used pivot table in excel? It's same. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 252, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th>PassengerId</th>\n", | |
" <th>1</th>\n", | |
" <th>2</th>\n", | |
" <th>3</th>\n", | |
" <th>4</th>\n", | |
" <th>5</th>\n", | |
" <th>6</th>\n", | |
" <th>7</th>\n", | |
" <th>8</th>\n", | |
" <th>9</th>\n", | |
" <th>10</th>\n", | |
" <th>...</th>\n", | |
" <th>882</th>\n", | |
" <th>883</th>\n", | |
" <th>884</th>\n", | |
" <th>885</th>\n", | |
" <th>886</th>\n", | |
" <th>887</th>\n", | |
" <th>888</th>\n", | |
" <th>889</th>\n", | |
" <th>890</th>\n", | |
" <th>891</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Sex</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>female</th>\n", | |
" <td>NaN</td>\n", | |
" <td>38.0</td>\n", | |
" <td>26.0</td>\n", | |
" <td>35.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>27.0</td>\n", | |
" <td>14.0</td>\n", | |
" <td>...</td>\n", | |
" <td>NaN</td>\n", | |
" <td>22.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>39.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>19.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>male</th>\n", | |
" <td>22.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>35.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>54.0</td>\n", | |
" <td>2.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>...</td>\n", | |
" <td>33.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>28.0</td>\n", | |
" <td>25.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>27.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>26.0</td>\n", | |
" <td>32.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>2 rows × 891 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"PassengerId 1 2 3 4 5 6 7 8 9 10 ... \\\n", | |
"Sex ... \n", | |
"female NaN 38.0 26.0 35.0 NaN NaN NaN NaN 27.0 14.0 ... \n", | |
"male 22.0 NaN NaN NaN 35.0 NaN 54.0 2.0 NaN NaN ... \n", | |
"\n", | |
"PassengerId 882 883 884 885 886 887 888 889 890 891 \n", | |
"Sex \n", | |
"female NaN 22.0 NaN NaN 39.0 NaN 19.0 NaN NaN NaN \n", | |
"male 33.0 NaN 28.0 25.0 NaN 27.0 NaN NaN 26.0 32.0 \n", | |
"\n", | |
"[2 rows x 891 columns]" | |
] | |
}, | |
"execution_count": 252, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# index = new index, columns = new_columns, values = values to put\n", | |
"\n", | |
"df.pivot(index='Sex', columns = 'PassengerId', values = 'Age')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In above case, use of pivot doesn't make sense but this is just an example" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### `stack` \n", | |
"\n", | |
"Convert whole df into 1 long format" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 258, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0 PassengerId 1\n", | |
" Survived 0\n", | |
" Pclass 3\n", | |
" Name Braund, Mr. Owen Harris\n", | |
" Sex male\n", | |
" Age 22\n", | |
" SibSp 1\n", | |
" Parch 0\n", | |
" Ticket A/5 21171\n", | |
" Fare 7.25\n", | |
" Embarked S\n", | |
"1 PassengerId 2\n", | |
" Survived 1\n", | |
" Pclass 1\n", | |
" Name Cumings, Mrs. John Bradley (Florence Briggs Th...\n", | |
" Sex female\n", | |
" Age 38\n", | |
" SibSp 1\n", | |
" Parch 0\n", | |
" Ticket PC 17599\n", | |
" Fare 71.2833\n", | |
" Cabin C85\n", | |
" Embarked C\n", | |
"2 PassengerId 3\n", | |
" Survived 1\n", | |
" Pclass 3\n", | |
" Name Heikkinen, Miss. Laina\n", | |
" Sex female\n", | |
" Age 26\n", | |
" SibSp 0\n", | |
" ... \n", | |
"888 Name Johnston, Miss. Catherine Helen \"Carrie\"\n", | |
" Sex female\n", | |
" SibSp 1\n", | |
" Parch 2\n", | |
" Ticket W./C. 6607\n", | |
" Fare 23.45\n", | |
" Embarked S\n", | |
"889 PassengerId 890\n", | |
" Survived 1\n", | |
" Pclass 1\n", | |
" Name Behr, Mr. Karl Howell\n", | |
" Sex male\n", | |
" Age 26\n", | |
" SibSp 0\n", | |
" Parch 0\n", | |
" Ticket 111369\n", | |
" Fare 30\n", | |
" Cabin C148\n", | |
" Embarked C\n", | |
"890 PassengerId 891\n", | |
" Survived 0\n", | |
" Pclass 3\n", | |
" Name Dooley, Mr. Patrick\n", | |
" Sex male\n", | |
" Age 32\n", | |
" SibSp 0\n", | |
" Parch 0\n", | |
" Ticket 370376\n", | |
" Fare 7.75\n", | |
" Embarked Q\n", | |
"Length: 9826, dtype: object" | |
] | |
}, | |
"execution_count": 258, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.stack()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"You won't generally use it. I have never come across its use over my experience with python" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Iteration\n", | |
"To get column/row indexes, series pair. \n", | |
"\n", | |
"* `iteritems()` for column-index, series\n", | |
"* `iterrows()` for row-index, series" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 286, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[(0, 'male'), (1, 'female'), (2, 'female'), (3, 'female'), (4, 'male')]" | |
] | |
}, | |
"execution_count": 286, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"list(df.Sex.iteritems())[:5]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 285, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(0, PassengerId 1\n", | |
" Survived 0\n", | |
" Pclass 3\n", | |
" Name Braund, Mr. Owen Harris\n", | |
" Sex male\n", | |
" Age 22\n", | |
" SibSp 1\n", | |
" Parch 0\n", | |
" Ticket A/5 21171\n", | |
" Fare 7.25\n", | |
" Cabin NaN\n", | |
" Embarked S\n", | |
" Name: 0, dtype: object)" | |
] | |
}, | |
"execution_count": 285, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"list(df.iterrows())[0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Apply functions\n", | |
"\n", | |
"* `apply` -> apply function over df\n", | |
"* `apply_map` -> apply function elementwise (for each series of df. think of column wise)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 338, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# function squares when type(x) = float, cubes when type(x) = int, return same when other\n", | |
"\n", | |
"f = lambda x: x**2 if type(x) == float else x**3 if type(x) == int else x\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 335, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0 52.562500\n", | |
"1 5081.308859\n", | |
"2 62.805625\n", | |
"Name: Fare, dtype: float64" | |
] | |
}, | |
"execution_count": 335, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# whole series is passed\n", | |
"\n", | |
"df.Fare.apply(f)[:3]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 339, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>PassengerId</th>\n", | |
" <th>Survived</th>\n", | |
" <th>Pclass</th>\n", | |
" <th>Name</th>\n", | |
" <th>Sex</th>\n", | |
" <th>Age</th>\n", | |
" <th>SibSp</th>\n", | |
" <th>Parch</th>\n", | |
" <th>Ticket</th>\n", | |
" <th>Fare</th>\n", | |
" <th>Cabin</th>\n", | |
" <th>Embarked</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>27</td>\n", | |
" <td>Braund, Mr. Owen Harris</td>\n", | |
" <td>male</td>\n", | |
" <td>484.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>A/5 21171</td>\n", | |
" <td>52.562500</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>8</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n", | |
" <td>female</td>\n", | |
" <td>1444.0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>PC 17599</td>\n", | |
" <td>5081.308859</td>\n", | |
" <td>C85</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>27</td>\n", | |
" <td>1</td>\n", | |
" <td>27</td>\n", | |
" <td>Heikkinen, Miss. Laina</td>\n", | |
" <td>female</td>\n", | |
" <td>676.0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>STON/O2. 3101282</td>\n", | |
" <td>62.805625</td>\n", | |
" <td>NaN</td>\n", | |
" <td>S</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" PassengerId Survived Pclass \\\n", | |
"0 1 0 27 \n", | |
"1 8 1 1 \n", | |
"2 27 1 27 \n", | |
"\n", | |
" Name Sex Age SibSp \\\n", | |
"0 Braund, Mr. Owen Harris male 484.0 1 \n", | |
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 1444.0 1 \n", | |
"2 Heikkinen, Miss. Laina female 676.0 0 \n", | |
"\n", | |
" Parch Ticket Fare Cabin Embarked \n", | |
"0 0 A/5 21171 52.562500 NaN S \n", | |
"1 0 PC 17599 5081.308859 C85 C \n", | |
"2 0 STON/O2. 3101282 62.805625 NaN S " | |
] | |
}, | |
"execution_count": 339, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# elements are passed\n", | |
"\n", | |
"df.applymap(f)[:3]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### End" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment