{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Week 7 Day 1: Structured data (AKA: Pandas DataFrames)\n",
"\n",
"## Objectives:\n",
"\n",
"* Learn to create and read in DataFrames\n",
"* Learn to use Series\n",
"* Learn some basic manipulation skills\n",
"* Learn where to find more information about Pandas"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's start with the following table of data:\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" time x y\n",
"\n",
" 0.0 -0.01255 -0.04794\n",
" 0.2222 0.1117 0.4421\n",
" 0.4444 0.1565 0.7246\n",
" 0.6667 0.2099 0.8601\n",
" 0.8889 0.2323 0.9558\n",
" 1.111 0.2989 0.956\n",
" 1.333 0.3558 0.8693\n",
" 1.556 0.5033 0.6938\n",
" 1.778 0.5434 0.3883\n",
" 2.0 0.6208 -0.02088\n"
]
}
],
"source": [
"state = np.random.RandomState(42)\n",
"time = np.linspace(0, 2, 10)\n",
"xs = time * 0.3 + (state.rand(10) - 0.5) * 0.1\n",
"ys = -(time ** 2) + 2 * time + (state.rand(10) - 0.5) * 0.1\n",
"print(\" time x y\\n\")\n",
"for t, x, y in zip(time, xs, ys):\n",
" print(f\"{t:10.4} {x:10.4} {y:10.4}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We would like to view and work with this as a coherent single entity. If we chose to use a matrix, we'd have some issues:\n",
"\n",
"* Our axes are inherently different - operations along columns make sense, rows... Not so much.\n",
"* One of the axis has labels (time, x, and y) that we'd lose, making our code harder to read\n",
"* What happens if we have different data types?\n",
"* Normal matrix operations (like multiplication) don't really make sense"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's just look at what a Pandas DataFrame would look like, then we'll talk a bit more about them. Note that there are a **ton** of ways to make a DataFrame. And we have some choices we will ignore for now."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" time \n",
" x \n",
" y \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.000000 \n",
" -0.012546 \n",
" -0.047942 \n",
" \n",
" \n",
" 1 \n",
" 0.222222 \n",
" 0.111738 \n",
" 0.442053 \n",
" \n",
" \n",
" 2 \n",
" 0.444444 \n",
" 0.156533 \n",
" 0.724602 \n",
" \n",
" \n",
" 3 \n",
" 0.666667 \n",
" 0.209866 \n",
" 0.860123 \n",
" \n",
" \n",
" 4 \n",
" 0.888889 \n",
" 0.232269 \n",
" 0.955837 \n",
" \n",
" \n",
" 5 \n",
" 1.111111 \n",
" 0.298933 \n",
" 0.955995 \n",
" \n",
" \n",
" 6 \n",
" 1.333333 \n",
" 0.355808 \n",
" 0.869313 \n",
" \n",
" \n",
" 7 \n",
" 1.555556 \n",
" 0.503284 \n",
" 0.693834 \n",
" \n",
" \n",
" 8 \n",
" 1.777778 \n",
" 0.543445 \n",
" 0.388256 \n",
" \n",
" \n",
" 9 \n",
" 2.000000 \n",
" 0.620807 \n",
" -0.020877 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" time x y\n",
"0 0.000000 -0.012546 -0.047942\n",
"1 0.222222 0.111738 0.442053\n",
"2 0.444444 0.156533 0.724602\n",
"3 0.666667 0.209866 0.860123\n",
"4 0.888889 0.232269 0.955837\n",
"5 1.111111 0.298933 0.955995\n",
"6 1.333333 0.355808 0.869313\n",
"7 1.555556 0.503284 0.693834\n",
"8 1.777778 0.543445 0.388256\n",
"9 2.000000 0.620807 -0.020877"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame({\"time\": time, \"x\": xs, \"y\": ys})\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our time would make a better index than the default 0,1,2,...,9, so let's try that:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x \n",
" y \n",
" \n",
" \n",
" time \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 0.000000 \n",
" -0.012546 \n",
" -0.047942 \n",
" \n",
" \n",
" 0.222222 \n",
" 0.111738 \n",
" 0.442053 \n",
" \n",
" \n",
" 0.444444 \n",
" 0.156533 \n",
" 0.724602 \n",
" \n",
" \n",
" 0.666667 \n",
" 0.209866 \n",
" 0.860123 \n",
" \n",
" \n",
" 0.888889 \n",
" 0.232269 \n",
" 0.955837 \n",
" \n",
" \n",
" 1.111111 \n",
" 0.298933 \n",
" 0.955995 \n",
" \n",
" \n",
" 1.333333 \n",
" 0.355808 \n",
" 0.869313 \n",
" \n",
" \n",
" 1.555556 \n",
" 0.503284 \n",
" 0.693834 \n",
" \n",
" \n",
" 1.777778 \n",
" 0.543445 \n",
" 0.388256 \n",
" \n",
" \n",
" 2.000000 \n",
" 0.620807 \n",
" -0.020877 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y\n",
"time \n",
"0.000000 -0.012546 -0.047942\n",
"0.222222 0.111738 0.442053\n",
"0.444444 0.156533 0.724602\n",
"0.666667 0.209866 0.860123\n",
"0.888889 0.232269 0.955837\n",
"1.111111 0.298933 0.955995\n",
"1.333333 0.355808 0.869313\n",
"1.555556 0.503284 0.693834\n",
"1.777778 0.543445 0.388256\n",
"2.000000 0.620807 -0.020877"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.set_index(\"time\", inplace=True)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# df.index = pd.to_timedelta(df.index, unit='s')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.plot()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# df.plot('x', 'y', kind='scatter');\n",
"df.plot.scatter(\"x\", \"y\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are two ways to access columns:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"time\n",
"0.000000 -0.012546\n",
"0.222222 0.111738\n",
"0.444444 0.156533\n",
"0.666667 0.209866\n",
"0.888889 0.232269\n",
"1.111111 0.298933\n",
"1.333333 0.355808\n",
"1.555556 0.503284\n",
"1.777778 0.543445\n",
"2.000000 0.620807\n",
"Name: x, dtype: float64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[\"x\"]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"time\n",
"0.000000 -0.012546\n",
"0.222222 0.111738\n",
"0.444444 0.156533\n",
"0.666667 0.209866\n",
"0.888889 0.232269\n",
"1.111111 0.298933\n",
"1.333333 0.355808\n",
"1.555556 0.503284\n",
"1.777778 0.543445\n",
"2.000000 0.620807\n",
"Name: x, dtype: float64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A column is a \"Series\": That's like a 1D array but with an index and possibly a name attached. The Series align on index instead of location - if you add two Series, matching indexed value will add."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `['x']` syntax is more general, but the `.x` syntax is shorter, and much nicer in a notebook. It doesn't work for setting brand new columns, or if the name of a column is not valid in Python or would overwrite an existing property or method.\n",
"\n",
"DataFrames and Series follow the array protocol, so numpy operation work on them too:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x \n",
" y \n",
" r \n",
" \n",
" \n",
" time \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 0.000000 \n",
" -0.012546 \n",
" -0.047942 \n",
" 0.049556 \n",
" \n",
" \n",
" 0.222222 \n",
" 0.111738 \n",
" 0.442053 \n",
" 0.455956 \n",
" \n",
" \n",
" 0.444444 \n",
" 0.156533 \n",
" 0.724602 \n",
" 0.741317 \n",
" \n",
" \n",
" 0.666667 \n",
" 0.209866 \n",
" 0.860123 \n",
" 0.885356 \n",
" \n",
" \n",
" 0.888889 \n",
" 0.232269 \n",
" 0.955837 \n",
" 0.983653 \n",
" \n",
" \n",
" 1.111111 \n",
" 0.298933 \n",
" 0.955995 \n",
" 1.001642 \n",
" \n",
" \n",
" 1.333333 \n",
" 0.355808 \n",
" 0.869313 \n",
" 0.939311 \n",
" \n",
" \n",
" 1.555556 \n",
" 0.503284 \n",
" 0.693834 \n",
" 0.857147 \n",
" \n",
" \n",
" 1.777778 \n",
" 0.543445 \n",
" 0.388256 \n",
" 0.667889 \n",
" \n",
" \n",
" 2.000000 \n",
" 0.620807 \n",
" -0.020877 \n",
" 0.621158 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x y r\n",
"time \n",
"0.000000 -0.012546 -0.047942 0.049556\n",
"0.222222 0.111738 0.442053 0.455956\n",
"0.444444 0.156533 0.724602 0.741317\n",
"0.666667 0.209866 0.860123 0.885356\n",
"0.888889 0.232269 0.955837 0.983653\n",
"1.111111 0.298933 0.955995 1.001642\n",
"1.333333 0.355808 0.869313 0.939311\n",
"1.555556 0.503284 0.693834 0.857147\n",
"1.777778 0.543445 0.388256 0.667889\n",
"2.000000 0.620807 -0.020877 0.621158"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[\"r\"] = np.sqrt(df.x ** 2 + df.y ** 2)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"DataFrames are designed to make it easy to add and operate on columns; you should not in general be adding new rows (this should tell you what the internal memory layout must be like)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that you can use `.apply` to apply a function to a DataFrame with a bit more control, or `.applymap` to apply a function element-wise to a DataFrame or Series (but the function is a Python function, so the loop must happen in Python so it is slower than `.apply`)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas features\n",
"\n",
"#### Pandas design:\n",
"* Make everything as Pythonic as possible. Even if that means there are many ways of doing things.\n",
"* Design around everyday usage rather than theory\n",
"\n",
"#### Features:\n",
"\n",
"* **Index** types: Several custom arrays with extra features for types of indexes\n",
" * Including hierarchical indexes, which allow multidimensional-like data to be used\n",
"* **Series**: A 1D array with an attached index\n",
" * New types: Powerful datetime and timedelta features, including special calender support, periodic times, etc.\n",
" * Categorical support (a bit more powerful than sets)\n",
"* **DataFrame**: a table of data with indexes and headers\n",
"* Great input/output support for lots of data formats (`.csv`, Excel, many more)\n",
"* Great output display, notebook support\n",
"* Amazing data manipulation\n",
"* Like Numpy, can be a standard for other statistical packages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Constructing and writing a dataframe\n",
"\n",
"* See the DataFrame's help for a massive list of options.\n",
"* Reading in a DataFrame is done with the `pd.read_*` functions.\n",
"* Writing a DataFrame is done with the `df.to_*` methods.\n",
"\n",
"See **Table 5-1: Possible data inputs to DataFrame constructor** in *Python for Data Analysis, 2nd edition*, by Wes McKinney. Also Chapter 6 for reading/writing DataFrames."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Indexing\n",
"\n",
"`df[x]` is a special case - it behaves differently depending on the arguments - columns normally but some cases are rows (such as when using a boolean Series). When doing something specific, use the specialized accessors:\n",
"\n",
"* `df[column]`: Select a column\n",
"* `df.loc[row, column]`: Indexing by names\n",
"* `df.iloc[row, column]`: Indexing by number\n",
"* `at` and `iat` are available for single values.\n",
"\n",
"Note that using a `list` is different than a `tuple` in an indexing expression in Pandas.\n",
"\n",
"#### See Table 5.4 for ways to index a DataFrame\n",
"\n",
"Indexing options with DataFrame in *Python for Data Analysis, 2nd edition*, by Wes McKinney."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Iris dataset\n",
"Let's look at one of the seaborn datasets (seaborn is a plotting wrapper on MatPlotLib that helps with statistical visualization - but we are just using it's handy example datasets which load in Pandas. Internet required.)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 145 \n",
" 6.7 \n",
" 3.0 \n",
" 5.2 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 146 \n",
" 6.3 \n",
" 2.5 \n",
" 5.0 \n",
" 1.9 \n",
" virginica \n",
" \n",
" \n",
" 147 \n",
" 6.5 \n",
" 3.0 \n",
" 5.2 \n",
" 2.0 \n",
" virginica \n",
" \n",
" \n",
" 148 \n",
" 6.2 \n",
" 3.4 \n",
" 5.4 \n",
" 2.3 \n",
" virginica \n",
" \n",
" \n",
" 149 \n",
" 5.9 \n",
" 3.0 \n",
" 5.1 \n",
" 1.8 \n",
" virginica \n",
" \n",
" \n",
"
\n",
"
150 rows × 5 columns
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width species\n",
"0 5.1 3.5 1.4 0.2 setosa\n",
"1 4.9 3.0 1.4 0.2 setosa\n",
"2 4.7 3.2 1.3 0.2 setosa\n",
"3 4.6 3.1 1.5 0.2 setosa\n",
"4 5.0 3.6 1.4 0.2 setosa\n",
".. ... ... ... ... ...\n",
"145 6.7 3.0 5.2 2.3 virginica\n",
"146 6.3 2.5 5.0 1.9 virginica\n",
"147 6.5 3.0 5.2 2.0 virginica\n",
"148 6.2 3.4 5.4 2.3 virginica\n",
"149 5.9 3.0 5.1 1.8 virginica\n",
"\n",
"[150 rows x 5 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = sns.load_dataset(\"iris\")\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A few things of note:\n",
"\n",
"* No column makes sense as an index here - we'll just leave the numerical index.\n",
"* We have a categorical column - but it didn't read in as a categorical datatype! That's easy to fix:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"df.species = df.species.astype(\"category\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can quickly get some information about the data:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 150.000000 \n",
" 150.000000 \n",
" 150.000000 \n",
" 150.000000 \n",
" \n",
" \n",
" mean \n",
" 5.843333 \n",
" 3.057333 \n",
" 3.758000 \n",
" 1.199333 \n",
" \n",
" \n",
" std \n",
" 0.828066 \n",
" 0.435866 \n",
" 1.765298 \n",
" 0.762238 \n",
" \n",
" \n",
" min \n",
" 4.300000 \n",
" 2.000000 \n",
" 1.000000 \n",
" 0.100000 \n",
" \n",
" \n",
" 25% \n",
" 5.100000 \n",
" 2.800000 \n",
" 1.600000 \n",
" 0.300000 \n",
" \n",
" \n",
" 50% \n",
" 5.800000 \n",
" 3.000000 \n",
" 4.350000 \n",
" 1.300000 \n",
" \n",
" \n",
" 75% \n",
" 6.400000 \n",
" 3.300000 \n",
" 5.100000 \n",
" 1.800000 \n",
" \n",
" \n",
" max \n",
" 7.900000 \n",
" 4.400000 \n",
" 6.900000 \n",
" 2.500000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width\n",
"count 150.000000 150.000000 150.000000 150.000000\n",
"mean 5.843333 3.057333 3.758000 1.199333\n",
"std 0.828066 0.435866 1.765298 0.762238\n",
"min 4.300000 2.000000 1.000000 0.100000\n",
"25% 5.100000 2.800000 1.600000 0.300000\n",
"50% 5.800000 3.000000 4.350000 1.300000\n",
"75% 6.400000 3.300000 5.100000 1.800000\n",
"max 7.900000 4.400000 6.900000 2.500000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 150 entries, 0 to 149\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 sepal_length 150 non-null float64 \n",
" 1 sepal_width 150 non-null float64 \n",
" 2 petal_length 150 non-null float64 \n",
" 3 petal_width 150 non-null float64 \n",
" 4 species 150 non-null category\n",
"dtypes: category(1), float64(4)\n",
"memory usage: 5.1 KB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"sepal_length float64\n",
"sepal_width float64\n",
"petal_length float64\n",
"petal_width float64\n",
"species category\n",
"dtype: object"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Accessors\n",
"\n",
"You can use an \"accessor\" (Pandas terminology) to perform operations on series as a specific type:\n",
"* `.str`: string methods that act on the series\n",
"* `.cat`: Operations on categories\n",
"* `.dt`: Datetime operations\n",
"* `.plot`: Serves two purposes, either acts like a plot function or gives you access to other types of plots"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 Setosa\n",
"1 Setosa\n",
"2 Setosa\n",
"3 Setosa\n",
"4 Setosa\n",
"Name: species, dtype: object"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.species.str.capitalize().head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['setosa', 'versicolor', 'virginica'], dtype='object')"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.species.cat.categories"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use a boolean Series to select rows from a DataFrame (or another Series):"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" petal_length \n",
" petal_width \n",
" species \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" 1.3 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" 1.5 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" 1.4 \n",
" 0.2 \n",
" setosa \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width petal_length petal_width species\n",
"0 5.1 3.5 1.4 0.2 setosa\n",
"1 4.9 3.0 1.4 0.2 setosa\n",
"2 4.7 3.2 1.3 0.2 setosa\n",
"3 4.6 3.1 1.5 0.2 setosa\n",
"4 5.0 3.6 1.4 0.2 setosa"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[df.species == \"setosa\"].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's select just two rows of our table: (Note: this *must* be a list, not a tuple)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" sepal_length \n",
" sepal_width \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 5.1 \n",
" 3.5 \n",
" \n",
" \n",
" 1 \n",
" 4.9 \n",
" 3.0 \n",
" \n",
" \n",
" 2 \n",
" 4.7 \n",
" 3.2 \n",
" \n",
" \n",
" 3 \n",
" 4.6 \n",
" 3.1 \n",
" \n",
" \n",
" 4 \n",
" 5.0 \n",
" 3.6 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" sepal_length sepal_width\n",
"0 5.1 3.5\n",
"1 4.9 3.0\n",
"2 4.7 3.2\n",
"3 4.6 3.1\n",
"4 5.0 3.6"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[[\"sepal_length\", \"sepal_width\"]].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can combine what we've learned:\n",
"\n",
"(notice the automatic x and y axis labels)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"for i, category in enumerate(df.species.cat.categories):\n",
" df[df.species == category].plot.scatter(\n",
" \"sepal_length\", \"sepal_width\", label=category, c=f\"C{i}\", ax=ax\n",
" )\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"MatPlotLib now has better support for Pandas, which makes this a bit easier:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"for category in df.species.cat.categories:\n",
" ax.scatter(\n",
" \"sepal_length\", \"sepal_width\", data=df[df.species == category], label=category\n",
" )\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We could make this even nicer with a groupby, which returns a group you can iterate over to get the name and dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"for name, group in df.groupby(\"species\"):\n",
" ax.scatter(\"sepal_length\", \"sepal_width\", data=group, label=name)\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pandas supports lots more, like database style merges and joins, etc.\n",
"\n",
"In general, the best thing to do with Pandas is search and look around to see if the functionality you want is there. Avoid loops and anything that looks ugly until you are sure it's the only what to do what you want."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pandas can be seen as similar to:\n",
"\n",
"* Excel\n",
"* R\n",
"* SQL\n",
"* SAS\n",
"* Stata\n",
"* ROOT (some parts)\n",
"\n",
"Learn more at:\n",
"\n",
"* [Pandas website](https://pandas.pydata.org)\n",
"* Our recommended book (available on the UC libraries online)\n",
"* [10 minutes to Pandas](http://pandas.pydata.org/pandas-docs/stable/10min.html)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "compclass",
"language": "python",
"name": "compclass"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}