{ "cells": [ { "cell_type": "markdown", "id": "b27b96d3-f1ea-4d10-acea-58ea9a04ad2a", "metadata": { "tags": [] }, "source": [ "## Tablular Data" ] }, { "cell_type": "code", "execution_count": 4, "id": "c2d30613-ece4-4e8b-ae39-2a5e63d0bec7", "metadata": { "tags": [] }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "id": "28c14039-0036-4dbf-b55c-487367d3152f", "metadata": {}, "source": [ "## Series: a column of data with an Index" ] }, { "cell_type": "code", "execution_count": 9, "id": "34a8b863-18df-4b69-a03e-d48e7f6a14e7", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 5.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 = pd.Series([1, 3, 5, np.nan, 6, 8])\n", "s1" ] }, { "cell_type": "code", "execution_count": 10, "id": "e8c1b854-5648-4e5b-9cf2-2cd6e7290614", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "2 10\n", "3 20\n", "4 30\n", "dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2 = pd.Series([10, 20, 30], index=[2, 3, 4])\n", "s2" ] }, { "cell_type": "markdown", "id": "1e186fb5-bbb5-4d6f-b5e4-f1685629e47a", "metadata": {}, "source": [ "The index _aligns_ the two datasets, comparing \"apples to apples\"." ] }, { "cell_type": "code", "execution_count": 11, "id": "f5b9bad6-49c0-48ce-bdbd-8b256547ada5", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "0 NaN\n", "1 NaN\n", "2 15.0\n", "3 NaN\n", "4 36.0\n", "5 NaN\n", "dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 + s2" ] }, { "cell_type": "markdown", "id": "7496b866-5ab6-490e-9717-e564b2346c01", "metadata": {}, "source": [ "## DataFrame: a table of columns with an Index" ] }, { "cell_type": "code", "execution_count": 15, "id": "494c8ec8-02c7-4e2d-9ff7-6be1f32779d1", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ab
000.021700
110.571916
220.943367
330.762479
440.893559
.........
95950.536255
96960.112918
97970.988750
98980.374512
99990.734572
\n", "

100 rows × 2 columns

\n", "
" ], "text/plain": [ " a b\n", "0 0 0.021700\n", "1 1 0.571916\n", "2 2 0.943367\n", "3 3 0.762479\n", "4 4 0.893559\n", ".. .. ...\n", "95 95 0.536255\n", "96 96 0.112918\n", "97 97 0.988750\n", "98 98 0.374512\n", "99 99 0.734572\n", "\n", "[100 rows x 2 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({\"a\": np.arange(100), \"b\": np.random.random(100)})\n", "df" ] }, { "cell_type": "code", "execution_count": 16, "id": "79c11fe0-5969-49d5-a6f6-ed4736648a47", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ab
000.021700
110.571916
220.943367
330.762479
440.893559
\n", "
" ], "text/plain": [ " a b\n", "0 0 0.021700\n", "1 1 0.571916\n", "2 2 0.943367\n", "3 3 0.762479\n", "4 4 0.893559" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 21, "id": "e9132d1e-dd04-442a-9168-b0c5b456ccf1", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 1\n", "2 2\n", "3 3\n", "4 4\n", " ..\n", "95 95\n", "96 96\n", "97 97\n", "98 98\n", "99 99\n", "Name: a, Length: 100, dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"a\"]" ] }, { "cell_type": "code", "execution_count": 36, "id": "d32db30d-d9c8-4482-be46-601de5bf4bcb", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abc
000.0217001.000000
110.5719160.995004
220.9433670.980067
330.7624790.955336
440.8935590.921061
\n", "
" ], "text/plain": [ " a b c\n", "0 0 0.021700 1.000000\n", "1 1 0.571916 0.995004\n", "2 2 0.943367 0.980067\n", "3 3 0.762479 0.955336\n", "4 4 0.893559 0.921061" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"c\"] = np.cos(df[\"a\"] / 10)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 49, "id": "cb856973-841d-44ff-a3ba-92a4ec7fd3a5", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abc
000.0217001.000000
110.5719160.995004
220.9433670.980067
330.7624790.955336
440.8935590.921061
550.2806200.877583
660.0749050.825336
770.0067150.764842
880.5469490.696707
990.7847400.621610
10100.7352690.540302
53530.1783310.554374
54540.9702790.634693
55550.5553800.708670
56560.8494760.775566
57570.0699650.834713
58580.5194180.885520
59590.8248160.927478
60600.3521840.960170
61610.3292330.983268
62620.8974450.996542
63630.4762130.999859
64640.6025630.993185
65650.2858940.976588
66660.9142000.950233
67670.5079880.914383
68680.8416180.869397
69690.3612950.815725
70700.8058750.753902
71710.4306370.684547
72720.2958650.608351
73730.5251680.526078
\n", "
" ], "text/plain": [ " a b c\n", "0 0 0.021700 1.000000\n", "1 1 0.571916 0.995004\n", "2 2 0.943367 0.980067\n", "3 3 0.762479 0.955336\n", "4 4 0.893559 0.921061\n", "5 5 0.280620 0.877583\n", "6 6 0.074905 0.825336\n", "7 7 0.006715 0.764842\n", "8 8 0.546949 0.696707\n", "9 9 0.784740 0.621610\n", "10 10 0.735269 0.540302\n", "53 53 0.178331 0.554374\n", "54 54 0.970279 0.634693\n", "55 55 0.555380 0.708670\n", "56 56 0.849476 0.775566\n", "57 57 0.069965 0.834713\n", "58 58 0.519418 0.885520\n", "59 59 0.824816 0.927478\n", "60 60 0.352184 0.960170\n", "61 61 0.329233 0.983268\n", "62 62 0.897445 0.996542\n", "63 63 0.476213 0.999859\n", "64 64 0.602563 0.993185\n", "65 65 0.285894 0.976588\n", "66 66 0.914200 0.950233\n", "67 67 0.507988 0.914383\n", "68 68 0.841618 0.869397\n", "69 69 0.361295 0.815725\n", "70 70 0.805875 0.753902\n", "71 71 0.430637 0.684547\n", "72 72 0.295865 0.608351\n", "73 73 0.525168 0.526078" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "masked = df[df[\"c\"] > 0.5]\n", "masked" ] }, { "cell_type": "markdown", "id": "3528e600-d557-4650-86ec-1c81a4b8f46b", "metadata": {}, "source": [ "## Pandas is good at data manipluation, filtering, and basic stats" ] }, { "cell_type": "code", "execution_count": 18, "id": "f1aeb70e-db89-4624-9e40-6ebf8b844e1f", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "a 4950.000000\n", "b 47.632534\n", "dtype: float64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sum()" ] }, { "cell_type": "code", "execution_count": 17, "id": "2ba0948a-6196-4056-a1f9-6ce645ccf591", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ab
count100.000000100.000000
mean49.5000000.476325
std29.0114920.294647
min0.0000000.006715
25%24.7500000.228288
50%49.5000000.470454
75%74.2500000.760325
max99.0000000.988750
\n", "
" ], "text/plain": [ " a b\n", "count 100.000000 100.000000\n", "mean 49.500000 0.476325\n", "std 29.011492 0.294647\n", "min 0.000000 0.006715\n", "25% 24.750000 0.228288\n", "50% 49.500000 0.470454\n", "75% 74.250000 0.760325\n", "max 99.000000 0.988750" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 42, "id": "20891bef-8399-4fa9-a311-e36caec23f68", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,\n", " 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,\n", " 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,\n", " 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,\n", " 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "binned = np.digitize(df[\"a\"], bins=np.arange(0, 100, 10))\n", "binned" ] }, { "cell_type": "code", "execution_count": 43, "id": "8a622fd4-41ac-4cc5-a581-ff55ef384850", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abc
14.50.4886950.863755
214.50.4714540.115592
324.50.426544-0.738845
434.50.365475-0.913992
544.50.411681-0.248819
654.50.5306560.645117
764.50.5568630.945935
874.50.5754230.377065
984.50.464790-0.538477
1094.50.471672-0.958946
\n", "
" ], "text/plain": [ " a b c\n", "1 4.5 0.488695 0.863755\n", "2 14.5 0.471454 0.115592\n", "3 24.5 0.426544 -0.738845\n", "4 34.5 0.365475 -0.913992\n", "5 44.5 0.411681 -0.248819\n", "6 54.5 0.530656 0.645117\n", "7 64.5 0.556863 0.945935\n", "8 74.5 0.575423 0.377065\n", "9 84.5 0.464790 -0.538477\n", "10 94.5 0.471672 -0.958946" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "avg_per_bin = df.groupby(binned).mean()\n", "avg_per_bin" ] }, { "cell_type": "code", "execution_count": 51, "id": "ed27da9e-fda0-4aee-9afb-2e63a88cbd48", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots()\n", "ax.plot(df[\"a\"], df[\"c\"], label=\"df\")\n", "ax.plot(masked[\"a\"], masked[\"c\"], label=\"masked\", marker=\"x\", linestyle=\"none\")\n", "ax.plot(avg_per_bin[\"a\"], avg_per_bin[\"c\"], label=\"avg_per_bin\")\n", "ax.legend()" ] }, { "cell_type": "markdown", "id": "793e649f-6e43-46c5-bb90-94c266158b62", "metadata": {}, "source": [ "## Reshaping" ] }, { "cell_type": "code", "execution_count": 81, "id": "3dd64e53-7cb4-40ee-8c06-47df245d4a0a", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sampletempoperatormeasurement
0Ni273Jane10
1Ni253Jane11
2Au272Jane10
3Au251Jane9
4Ag275Joe11
5Ag250Joe9
6Ag273Joe10
7Fe271Chris13
8Fe253Chris11
\n", "
" ], "text/plain": [ " sample temp operator measurement\n", "0 Ni 273 Jane 10\n", "1 Ni 253 Jane 11\n", "2 Au 272 Jane 10\n", "3 Au 251 Jane 9\n", "4 Ag 275 Joe 11\n", "5 Ag 250 Joe 9\n", "6 Ag 273 Joe 10\n", "7 Fe 271 Chris 13\n", "8 Fe 253 Chris 11" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiments = pd.DataFrame(\n", " {\n", " \"sample\": [\"Ni\", \"Ni\", \"Au\", \"Au\", \"Ag\", \"Ag\", \"Ag\", \"Fe\", \"Fe\"],\n", " \"temp\": [273, 253, 272, 251, 275, 250, 273, 271, 253],\n", " \"operator\": [\"Jane\", \"Jane\", \"Jane\", \"Jane\", \"Joe\", \"Joe\", \"Joe\", \"Chris\", \"Chris\"],\n", " \"measurement\": [10, 11, 10, 9, 11, 9, 10, 13, 11],\n", " }\n", ")\n", "experiments" ] }, { "cell_type": "code", "execution_count": 83, "id": "6e60ba16-e485-413a-9d6a-d3553405c109", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
measurement
operatorChrisJaneJoe
sampletemp
Ag250NaNNaN9.0
273NaNNaN10.0
275NaNNaN11.0
Au251NaN9.0NaN
272NaN10.0NaN
Fe25311.0NaNNaN
27113.0NaNNaN
Ni253NaN11.0NaN
273NaN10.0NaN
\n", "
" ], "text/plain": [ " measurement \n", "operator Chris Jane Joe\n", "sample temp \n", "Ag 250 NaN NaN 9.0\n", " 273 NaN NaN 10.0\n", " 275 NaN NaN 11.0\n", "Au 251 NaN 9.0 NaN\n", " 272 NaN 10.0 NaN\n", "Fe 253 11.0 NaN NaN\n", " 271 13.0 NaN NaN\n", "Ni 253 NaN 11.0 NaN\n", " 273 NaN 10.0 NaN" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pivoted = pd.pivot_table(experiments, index=[\"sample\", \"temp\"], columns=[\"operator\"])\n", "pivoted" ] }, { "cell_type": "code", "execution_count": 84, "id": "9d53063b-fb8a-4e05-a6a4-e527c1962d54", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
measurement
sampletempoperator
Ag250Joe9.0
273Joe10.0
275Joe11.0
Au251Jane9.0
272Jane10.0
Fe253Chris11.0
271Chris13.0
Ni253Jane11.0
273Jane10.0
\n", "
" ], "text/plain": [ " measurement\n", "sample temp operator \n", "Ag 250 Joe 9.0\n", " 273 Joe 10.0\n", " 275 Joe 11.0\n", "Au 251 Jane 9.0\n", " 272 Jane 10.0\n", "Fe 253 Chris 11.0\n", " 271 Chris 13.0\n", "Ni 253 Jane 11.0\n", " 273 Jane 10.0" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pivoted.stack()" ] }, { "cell_type": "code", "execution_count": 85, "id": "2adba235-44f1-4906-850c-93529769fbde", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
measurement
operatorChrisJaneJoe
temp250251253271272273275250251253...272273275250251253271272273275
sample
AgNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaN9.0NaNNaNNaNNaN10.011.0
AuNaNNaNNaNNaNNaNNaNNaNNaN9.0NaN...10.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
FeNaNNaN11.013.0NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
NiNaNNaNNaNNaNNaNNaNNaNNaNNaN11.0...NaN10.0NaNNaNNaNNaNNaNNaNNaNNaN
\n", "

4 rows × 21 columns

\n", "
" ], "text/plain": [ " measurement ... \\\n", "operator Chris Jane ... \n", "temp 250 251 253 271 272 273 275 250 251 253 ... 272 \n", "sample ... \n", "Ag NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN \n", "Au NaN NaN NaN NaN NaN NaN NaN NaN 9.0 NaN ... 10.0 \n", "Fe NaN NaN 11.0 13.0 NaN NaN NaN NaN NaN NaN ... NaN \n", "Ni NaN NaN NaN NaN NaN NaN NaN NaN NaN 11.0 ... NaN \n", "\n", " \n", "operator Joe \n", "temp 273 275 250 251 253 271 272 273 275 \n", "sample \n", "Ag NaN NaN 9.0 NaN NaN NaN NaN 10.0 11.0 \n", "Au NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "Fe NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "Ni 10.0 NaN NaN NaN NaN NaN NaN NaN NaN \n", "\n", "[4 rows x 21 columns]" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pivoted.unstack()" ] }, { "cell_type": "markdown", "id": "5b05d225-4c3e-4502-83cf-8096d2b90b90", "metadata": {}, "source": [ "## Anatomy of a DataFrame" ] }, { "cell_type": "code", "execution_count": 52, "id": "eaa8236a-dae1-452e-bd3d-1993c7a1fff9", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "Index(['a', 'b', 'c'], dtype='object')" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 53, "id": "e63e73d0-e547-4a2c-8d2c-b03c0f51f6a4", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=100, step=1)" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "markdown", "id": "8ffc481a-a9e8-4205-917b-939153c7a121", "metadata": { "tags": [] }, "source": [ "Column-wise access is fast; row-wise access is slow." ] }, { "cell_type": "code", "execution_count": 57, "id": "40dcb344-752f-4f2a-a570-7ed368a3b42c", "metadata": { "tags": [] }, "outputs": [], "source": [ "# This will be comparatively slow. On small tables it may not matter.\n", "for index, row in df.iterrows():\n", " ..." ] }, { "cell_type": "markdown", "id": "1c5ba037-b79c-4c0d-be4e-50c1638f2e24", "metadata": { "tags": [] }, "source": [ "Is a DataFrame 1-dimensional or 2-dimensional?" ] }, { "cell_type": "code", "execution_count": 73, "id": "83065de4-9cce-42c9-a148-1273cdcb49c0", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abc
000.0217001.000000
110.5719160.995004
220.9433670.980067
330.7624790.955336
440.8935590.921061
\n", "
" ], "text/plain": [ " a b c\n", "0 0 0.021700 1.000000\n", "1 1 0.571916 0.995004\n", "2 2 0.943367 0.980067\n", "3 3 0.762479 0.955336\n", "4 4 0.893559 0.921061" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "id": "84a40f0a-f7e4-425b-8c4a-f10d1accbdbc", "metadata": {}, "source": [ "## Peeking under the hood, just for a moment\n", "\n", "Pandas is more complex inside than numpy.\n", "\n", "Underlying data is organized into \"blocks\" of like data type. Sometimes the blocks store numpy arrays; sometimes they store something more specialized." ] }, { "cell_type": "code", "execution_count": 60, "id": "3e39c0f6-9d7f-4089-bcd9-081f4fc211d4", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "BlockManager\n", "Items: Index(['a', 'b', 'c'], dtype='object')\n", "Axis 1: RangeIndex(start=0, stop=100, step=1)\n", "NumericBlock: slice(1, 3, 1), 2 x 100, dtype: float64\n", "NumericBlock: slice(0, 1, 1), 1 x 100, dtype: int64" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df._data" ] }, { "cell_type": "code", "execution_count": 66, "id": "38d62c2a-6312-4b2d-9d18-5364fe6c1e78", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "(NumericBlock: slice(1, 3, 1), 2 x 100, dtype: float64,\n", " NumericBlock: slice(0, 1, 1), 1 x 100, dtype: int64)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df._data.blocks" ] }, { "cell_type": "code", "execution_count": 71, "id": "9d581220-d930-4f5b-aba2-90c8e67f61ad", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.02169961, 0.57191617, 0.94336744, 0.76247875, 0.89355944,\n", " 0.28061985, 0.07490485, 0.00671478, 0.54694905, 0.78474025,\n", " 0.73526894, 0.13130981, 0.3284698 , 0.19313359, 0.67364605,\n", " 0.46469555, 0.25197018, 0.6480102 , 0.90820986, 0.37982242,\n", " 0.50418041, 0.1394719 , 0.177409 , 0.09648807, 0.57920907,\n", " 0.12140765, 0.77264377, 0.62380269, 0.84016833, 0.4106641 ,\n", " 0.36880325, 0.28877727, 0.59150967, 0.38334719, 0.286111 ,\n", " 0.52722373, 0.00834346, 0.09297144, 0.15996142, 0.94769908,\n", " 0.02287614, 0.23246116, 0.90280447, 0.18027103, 0.89933323,\n", " 0.32089887, 0.89943022, 0.03315442, 0.41586305, 0.20971634,\n", " 0.75960768, 0.42505656, 0.15423074, 0.17833109, 0.97027914,\n", " 0.55537967, 0.84947565, 0.06996517, 0.51941796, 0.82481572,\n", " 0.35218439, 0.32923343, 0.89744524, 0.47621268, 0.60256269,\n", " 0.28589414, 0.91420016, 0.50798777, 0.84161808, 0.36129532,\n", " 0.80587483, 0.43063669, 0.29586512, 0.52516787, 0.7025272 ,\n", " 0.92243695, 0.00694605, 0.48695912, 0.79557451, 0.7822406 ,\n", " 0.21576979, 0.66088274, 0.24881061, 0.97540968, 0.76987802,\n", " 0.20054532, 0.23896566, 0.50409409, 0.0162174 , 0.81733116,\n", " 0.43694734, 0.58238885, 0.61299265, 0.32765915, 0.00972478,\n", " 0.536255 , 0.11291805, 0.98874984, 0.37451228, 0.73457169],\n", " [ 1. , 0.99500417, 0.98006658, 0.95533649, 0.92106099,\n", " 0.87758256, 0.82533561, 0.76484219, 0.69670671, 0.62160997,\n", " 0.54030231, 0.45359612, 0.36235775, 0.26749883, 0.16996714,\n", " 0.0707372 , -0.02919952, -0.12884449, -0.22720209, -0.32328957,\n", " -0.41614684, -0.5048461 , -0.58850112, -0.66627602, -0.73739372,\n", " -0.80114362, -0.85688875, -0.90407214, -0.94222234, -0.97095817,\n", " -0.9899925 , -0.99913515, -0.99829478, -0.98747977, -0.96679819,\n", " -0.93645669, -0.89675842, -0.84810003, -0.79096771, -0.7259323 ,\n", " -0.65364362, -0.57482395, -0.49026082, -0.40079917, -0.30733287,\n", " -0.2107958 , -0.11215253, -0.01238866, 0.08749898, 0.18651237,\n", " 0.28366219, 0.37797774, 0.46851667, 0.55437434, 0.63469288,\n", " 0.70866977, 0.77556588, 0.83471278, 0.88551952, 0.92747843,\n", " 0.96017029, 0.98326844, 0.9965421 , 0.99985864, 0.99318492,\n", " 0.97658763, 0.95023259, 0.91438315, 0.86939749, 0.8157251 ,\n", " 0.75390225, 0.68454667, 0.60835131, 0.52607752, 0.43854733,\n", " 0.34663532, 0.25125984, 0.15337386, 0.05395542, -0.04600213,\n", " -0.14550003, -0.24354415, -0.33915486, -0.43137684, -0.51928865,\n", " -0.6020119 , -0.67872005, -0.74864665, -0.81109301, -0.86543521,\n", " -0.91113026, -0.9477216 , -0.97484362, -0.99222533, -0.99969304,\n", " -0.99717216, -0.98468786, -0.96236488, -0.93042627, -0.88919115]])" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df._data.blocks[0].values" ] }, { "cell_type": "markdown", "id": "de3717af-f90e-4cef-a867-8903d131073a", "metadata": { "tags": [] }, "source": [ "## Limitations and Coping Strategies\n", "\n", "* The index can get in the way if you don't actually need an index.\n", " * Consider a simple dict or other container of numpy arrays.\n", " * Consider xarray.\n", "* Pandas has a large interface and can be confusing.\n", " * StackOverflow!\n", "* Whereas numpy just has array, pandas has Series and DataFrame. It can take some getting used to know what to expect.\n", " * Work with toy examples at first.\n", "* Pandas DataFrames are designed for _tabular_ data. It does not perform well with higher-dimensional data.\n", " * Consider xarray." ] }, { "cell_type": "code", "execution_count": null, "id": "b5ccd779-3a6a-4461-aa9b-6b3193d866eb", "metadata": {}, "outputs": [], "source": [] } ], "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.10.10" } }, "nbformat": 4, "nbformat_minor": 5 }