{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "###
San Jose State University
Department of Applied Data Science

**DATA 200
Computational Programming for Data Analytics**

Spring 2024
Instructor: Ron Mak
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 7.14.2 `DataFrame`\n", "#### A `DataFrame` is an **enhanced two-dimensional array**. It can have custom row and column indices, and it has built-in methods for data analytics. It can support missing data. Each column is a `Series`, and the `Series` representing each column can contain different datatypes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating a `DataFrame` from a Dictionary" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades_dict = {'Wally': [87, 96, 70], 'Eva': [100, 87, 90],\n", " 'Sam': [94, 77, 90], 'Katie': [100, 81, 82],\n", " 'Bob': [83, 65, 85]}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades = pd.DataFrame(grades_dict)\n", "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Customizing a `DataFrame`’s Indices with the `index` Attribute \n", "#### The number of indices in the one-dimensional array of indices must equal the number of rows in the dataframe." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades = pd.DataFrame(grades_dict, index=['Exam1', 'Exam2', 'Exam3'])\n", "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.index = ['Test1', 'Test2', 'Test3']\n", "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Accessing a `DataFrame`’s ***Columns***" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades['Eva']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.Sam" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(grades.Sam)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[['Eva', 'Katie']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(grades[['Eva', 'Katie']])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selecting ***Rows*** via the `loc` and `iloc` Attributes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Use `loc` to select a dataframe row. Note the difference between the following two:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "grades.loc['Test1']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.loc[['Test1']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The first result is a `Series`. But when the indices are in a list, the result is a `DataFrame`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(f\"{type(grades.loc['Test1']) = }\")\n", "print(f\"{type(grades.loc[['Test1']]) = }\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Use `iloc` if the index is an integer value." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iloc[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iloc[[1]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iat[1, 2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selecting Rows via Slices and Lists with the `loc` and `iloc` Attributes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.loc['Test1':'Test3'] # includes upper limit" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iloc[0:2] # upper limit not included" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.loc[['Test1', 'Test3']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iloc[[0, 2]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Selecting Subsets of the Rows and Columns " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### When you use `loc` to slice a dataframe, the high index is ***included***." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.loc['Test1':'Test2', ['Eva', 'Katie']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### But if you use `iloc` to slice, the high index is ***excluded***." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iloc[[0, 2], 0:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Boolean Indexing" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Display the grades that are >= 90:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[grades >= 90]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Test whether each grade is >= 90:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades >= 90" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### `NaN` is \"not a number\", a dataframe's notation for a missing value." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[(grades >= 80) & (grades < 90)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[(grades >= 80) & (grades < 90)]['Bob']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[(grades >= 80) & (grades < 90)].Bob" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[(grades >= 80) & (grades < 90)][['Bob']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades[(grades >= 80) & (grades < 90)][['Wally', 'Bob']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Accessing a Specific `DataFrame` Cell by Row and Column" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.at['Test2', 'Eva']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iat[2, 0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.at['Test2', 'Eva'] = 100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.at['Test2', 'Eva']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.iat[1, 2] = 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Descriptive Statistics" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.describe()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pd.set_option('display.precision', 3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What's each student's mean (average) score?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Transposing the `DataFrame` with the `T` Attribute" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.T" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.T.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What's the average score of each test?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.T.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting By Rows by Their Indices" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.sort_index(ascending=False)" ] }, { "attachments": { "cd01ac05-e4cf-4ea3-9698-37baaad7f45d.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting By Column Indices\n", "![Screenshot 2023-04-11 at 10.14.55 PM.png](attachment:cd01ac05-e4cf-4ea3-9698-37baaad7f45d.png)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.sort_index(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The default is `axis=0` (sort by rows)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting By Column Values" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.sort_values(by='Test1', axis=1, ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sorting by Row Values" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.T.sort_values(by='Test1', ascending=False) # default is axis=0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.loc['Test1'].sort_values(ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Copy vs. In-Place Sorting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### By default, methods `sort_index()` and `sort_values()` each creates and returns a ***copy*** of the dataframe, which may be undesirable for large dataframes. To sort a dataframe in place, include the keyword argument `inplace=True`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades.sort_index(axis=1, inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "grades" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "##########################################################################\n", "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", "# Pearson Education, Inc. All Rights Reserved. #\n", "# #\n", "# DISCLAIMER: The authors and publisher of this book have used their #\n", "# best efforts in preparing the book. These efforts include the #\n", "# development, research, and testing of the theories and programs #\n", "# to determine their effectiveness. The authors and publisher make #\n", "# no warranty of any kind, expressed or implied, with regard to these #\n", "# programs or to the documentation contained in these books. The authors #\n", "# and publisher shall not be liable in any event for incidental or #\n", "# consequential damages in connection with, or arising out of, the #\n", "# furnishing, performance, or use of these programs. #\n", "##########################################################################\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Additional material (C) Copyright 2024 by Ronald Mak" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 4 }