From deef1b74dbcc3bc02831ec4178b7049b5b7d6db7 Mon Sep 17 00:00:00 2001
From: 100gle <569590461@qq.com>
Date: Thu, 30 Jun 2022 09:04:07 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EVol18=E7=AB=A0?=
=?UTF-8?q?=E8=8A=82=E7=A4=BA=E4=BE=8B=E6=BA=90=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
code/18/pandas_advanced_tricks.ipynb | 2464 ++++++++++++++++++++++++++
code/18/plot.ipynb | 460 +++++
data/python-logo-master-v3-TM.png | Bin 0 -> 83564 bytes
3 files changed, 2924 insertions(+)
create mode 100644 code/18/pandas_advanced_tricks.ipynb
create mode 100644 code/18/plot.ipynb
create mode 100644 data/python-logo-master-v3-TM.png
diff --git a/code/18/pandas_advanced_tricks.ipynb b/code/18/pandas_advanced_tricks.ipynb
new file mode 100644
index 0000000..3ed3f67
--- /dev/null
+++ b/code/18/pandas_advanced_tricks.ipynb
@@ -0,0 +1,2464 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# applymap"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " b | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a b\n",
+ "0 4 6\n",
+ "1 4 3"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "df = pd.DataFrame(\n",
+ " dict(\n",
+ " a=[[13, 3, 5, 6], [2, 4, 65, 6]],\n",
+ " b=[[44, 5, 6, 88, 0.5, 1], [\"22\", 40, 100]],\n",
+ " )\n",
+ ")\n",
+ "df.head()\n",
+ "df.applymap(lambda x: len(x))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# pipe"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Complex is better than complicated.Flat is better than nested."
+ ]
+ }
+ ],
+ "source": [
+ "%%bash\n",
+ "echo \"\n",
+ "Beautiful is better than ugly.\n",
+ "Explicit is better than implicit.\n",
+ "Simple is better than complex.\n",
+ "Complex is better than complicated.\n",
+ "Flat is better than nested.\n",
+ "Sparse is better than dense.\" | \\\n",
+ "grep ed | \\\n",
+ "tr -d \"\\n\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## 管道操作模拟"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def echo():\n",
+ " poetry = \"\"\"\n",
+ "Beautiful is better than ugly.\n",
+ "Explicit is better than implicit.\n",
+ "Simple is better than complex.\n",
+ "Complex is better than complicated.\n",
+ "Flat is better than nested.\n",
+ "Sparse is better than dense.\"\n",
+ " \"\"\"\n",
+ " return poetry.strip()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def grep(content: str, pattern: str):\n",
+ " import re\n",
+ "\n",
+ " filtered = []\n",
+ " content = content.splitlines()\n",
+ " for line in content:\n",
+ " if re.search(pattern, line):\n",
+ " filtered.append(line)\n",
+ "\n",
+ " return \"\".join(filtered)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def tr(content: str, delete: bool, char: str):\n",
+ " final = []\n",
+ "\n",
+ " if delete:\n",
+ " content = content.splitlines()\n",
+ " for line in content:\n",
+ " new_line = line.replace(char, \"\")\n",
+ " final.append(new_line)\n",
+ " if final:\n",
+ " return \"\".join(final)\n",
+ "\n",
+ " return content"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'Complex is better than complicated.Flat is better than nested.'"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# pipe line\n",
+ "tr(\n",
+ " content=grep(\n",
+ " content=echo(),\n",
+ " pattern=\"ed\",\n",
+ " ),\n",
+ " delete=True,\n",
+ " char=\"\\n\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## DataFrame.pipe 示例"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " a | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " b | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " d | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " e | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a\n",
+ "0 a\n",
+ "1 b\n",
+ "2 c\n",
+ "3 d\n",
+ "4 e"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "data = pd.DataFrame(\n",
+ " dict(\n",
+ " a=list(\"abcde\"),\n",
+ " )\n",
+ ")\n",
+ "data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def parse(df: pd.DataFrame):\n",
+ " length = df[\"a\"].shape[0]\n",
+ " df[\"b\"] = list(range(1, length + 1))\n",
+ " df[\"c\"] = [v.upper() if v in [\"a\", \"b\", \"c\"] else None for v in df[\"a\"]]\n",
+ "\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def upper(df: pd.DataFrame, cols=None):\n",
+ " if cols:\n",
+ " df[cols] = df[cols].astype(str).applymap(lambda s: s.upper())\n",
+ " return df\n",
+ " return df.applymap(lambda s: str(s).upper())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " b | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " A | \n",
+ " 1 | \n",
+ " A | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " B | \n",
+ " 2 | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " C | \n",
+ " 3 | \n",
+ " C | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " D | \n",
+ " 4 | \n",
+ " NONE | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " E | \n",
+ " 5 | \n",
+ " NONE | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a b c\n",
+ "0 A 1 A\n",
+ "1 B 2 B\n",
+ "2 C 3 C\n",
+ "3 D 4 NONE\n",
+ "4 E 5 NONE"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.pipe(parse).pipe(upper)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " b | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " A | \n",
+ " 1 | \n",
+ " A | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " B | \n",
+ " 2 | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " C | \n",
+ " 3 | \n",
+ " C | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " D | \n",
+ " 4 | \n",
+ " None | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " E | \n",
+ " 5 | \n",
+ " None | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a b c\n",
+ "0 A 1 A\n",
+ "1 B 2 B\n",
+ "2 C 3 C\n",
+ "3 D 4 None\n",
+ "4 E 5 None"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.pipe(parse).pipe(upper, cols=[\"a\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# rename"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['a', 'b'], dtype='object')"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "data = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))\n",
+ "df = data.copy(deep=True) # 1\n",
+ "df.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['A', 'B'], dtype='object')"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mapper = [\"A\", \"B\"]\n",
+ "df.columns = mapper\n",
+ "df\n",
+ "df.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " b | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a b\n",
+ "0 1 4\n",
+ "1 2 5\n",
+ "2 3 6"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = data.copy(deep=True)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['a', 'B']"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cols = df.columns.tolist() # 1\n",
+ "cols[cols.index(\"b\")] = \"B\" # 2\n",
+ "cols # 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['a', 'B'], dtype='object')"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.columns = cols # 4\n",
+ "df.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a B\n",
+ "0 1 4\n",
+ "1 2 5\n",
+ "2 3 6"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = data.copy(deep=True)\n",
+ "df.rename(columns={\"b\": \"B\"}) # 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['a', 'b'], dtype='object')"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.columns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a B\n",
+ "0 1 4\n",
+ "1 2 5\n",
+ "2 3 6"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.rename(columns=lambda v: \"B\" if v == \"b\" else v)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# filter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " a2 | \n",
+ " a3 | \n",
+ " b1 | \n",
+ " c1 | \n",
+ " d1 | \n",
+ " b2 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " U | \n",
+ " H | \n",
+ " p | \n",
+ " Z | \n",
+ " p | \n",
+ " G | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " N | \n",
+ " A | \n",
+ " c | \n",
+ " B | \n",
+ " W | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " R | \n",
+ " B | \n",
+ " z | \n",
+ " K | \n",
+ " I | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " r | \n",
+ " y | \n",
+ " a | \n",
+ " k | \n",
+ " u | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " H | \n",
+ " Q | \n",
+ " D | \n",
+ " J | \n",
+ " j | \n",
+ " J | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 a2 a3 b1 c1 d1 b2\n",
+ "0 k U H p Z p G\n",
+ "1 z N A c B W B\n",
+ "2 X R B z K I B\n",
+ "3 Y r y a k u F\n",
+ "4 Y H Q D J j J"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import random\n",
+ "import string\n",
+ "\n",
+ "import pandas as pd\n",
+ "\n",
+ "data = pd.DataFrame(\n",
+ " dict(\n",
+ " a1=random.choices(string.ascii_letters, k=5),\n",
+ " a2=random.choices(string.ascii_letters, k=5),\n",
+ " a3=random.choices(string.ascii_letters, k=5),\n",
+ " b1=random.choices(string.ascii_letters, k=5),\n",
+ " c1=random.choices(string.ascii_letters, k=5),\n",
+ " d1=random.choices(string.ascii_letters, k=5),\n",
+ " b2=random.choices(string.ascii_letters, k=5),\n",
+ " )\n",
+ ")\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " b1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " p | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " z | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " a | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " D | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 b1\n",
+ "0 k p\n",
+ "1 z c\n",
+ "2 X z\n",
+ "3 Y a\n",
+ "4 Y D"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.loc[:, [\"a1\", \"b1\"]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " b1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " p | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " z | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " a | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " D | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 b1\n",
+ "0 k p\n",
+ "1 z c\n",
+ "2 X z\n",
+ "3 Y a\n",
+ "4 Y D"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data[[\"a1\", \"b1\"]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['a1', 'a2', 'a3', 'b1', 'c1', 'd1', 'b2']\n"
+ ]
+ }
+ ],
+ "source": [
+ "cols = data.columns.tolist()\n",
+ "print(cols)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['a1', 'b1', 'c1', 'd1']\n"
+ ]
+ }
+ ],
+ "source": [
+ "cols = [col for col in cols if col.endswith(\"1\")]\n",
+ "print(cols)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " b1 | \n",
+ " c1 | \n",
+ " d1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " p | \n",
+ " Z | \n",
+ " p | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " c | \n",
+ " B | \n",
+ " W | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " z | \n",
+ " K | \n",
+ " I | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " a | \n",
+ " k | \n",
+ " u | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " D | \n",
+ " J | \n",
+ " j | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 b1 c1 d1\n",
+ "0 k p Z p\n",
+ "1 z c B W\n",
+ "2 X z K I\n",
+ "3 Y a k u\n",
+ "4 Y D J j"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data[cols]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " b1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " p | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " c | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " z | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " a | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " D | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 b1\n",
+ "0 k p\n",
+ "1 z c\n",
+ "2 X z\n",
+ "3 Y a\n",
+ "4 Y D"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.filter(items=[\"a1\", \"b1\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " b1 | \n",
+ " c1 | \n",
+ " d1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " p | \n",
+ " Z | \n",
+ " p | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " c | \n",
+ " B | \n",
+ " W | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " z | \n",
+ " K | \n",
+ " I | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " a | \n",
+ " k | \n",
+ " u | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " D | \n",
+ " J | \n",
+ " j | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 b1 c1 d1\n",
+ "0 k p Z p\n",
+ "1 z c B W\n",
+ "2 X z K I\n",
+ "3 Y a k u\n",
+ "4 Y D J j"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.filter(regex=r\"^[a-d]1$\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a1 | \n",
+ " a2 | \n",
+ " b1 | \n",
+ " c1 | \n",
+ " b2 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " k | \n",
+ " U | \n",
+ " p | \n",
+ " Z | \n",
+ " G | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " z | \n",
+ " N | \n",
+ " c | \n",
+ " B | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " X | \n",
+ " R | \n",
+ " z | \n",
+ " K | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " Y | \n",
+ " r | \n",
+ " a | \n",
+ " k | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Y | \n",
+ " H | \n",
+ " D | \n",
+ " J | \n",
+ " J | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a1 a2 b1 c1 b2\n",
+ "0 k U p Z G\n",
+ "1 z N c B B\n",
+ "2 X R z K B\n",
+ "3 Y r a k F\n",
+ "4 Y H D J J"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.filter(regex=r\"^(a|b|c)[1-2]$\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# assign"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " a\n",
+ "0 h\n",
+ "1 e\n",
+ "2 l\n",
+ "3 l\n",
+ "4 o\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "data = pd.DataFrame(\n",
+ " dict(\n",
+ " a=list(\"hello\"),\n",
+ " )\n",
+ ")\n",
+ "print(data.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " a b\n",
+ "0 H 1\n",
+ "1 E 2\n",
+ "2 L 3\n",
+ "3 L 4\n",
+ "4 O 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "data[\"a\"] = data[\"a\"].str.upper()\n",
+ "data[\"b\"] = list(range(1, 6))\n",
+ "print(data.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " a | \n",
+ " b | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " H | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " E | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " L | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " L | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " O | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " a b\n",
+ "0 H 1\n",
+ "1 E 2\n",
+ "2 L 3\n",
+ "3 L 4\n",
+ "4 O 5"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data = pd.DataFrame(\n",
+ " dict(\n",
+ " a=list(\"hello\"),\n",
+ " )\n",
+ ")\n",
+ "data.assign(\n",
+ " a=data[\"a\"].str.upper(),\n",
+ " b=list(range(1, 6)),\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# eval & query"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " O | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " k | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " Z | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "0 1 O\n",
+ "1 2 L\n",
+ "2 3 k\n",
+ "3 4 F\n",
+ "4 5 Z"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import random\n",
+ "import string\n",
+ "\n",
+ "import pandas as pd\n",
+ "\n",
+ "random.seed(3.14)\n",
+ "\n",
+ "data = pd.DataFrame(\n",
+ " dict(\n",
+ " uid=list(range(1, 11)),\n",
+ " pid=random.choices(string.ascii_letters, k=10),\n",
+ " )\n",
+ ")\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " u | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " V | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10 | \n",
+ " m | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "1 2 L\n",
+ "3 4 F\n",
+ "5 6 u\n",
+ "7 8 V\n",
+ "9 10 m"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.loc[data[\"uid\"] % 2 == 0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "1 2 L\n",
+ "3 4 F"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# fmt:off\n",
+ "data.loc[\n",
+ " (data[\"uid\"] % 2 == 0)\n",
+ " & (data[\"pid\"].str.isupper())\n",
+ " & (data[\"pid\"] != \"V\")\n",
+ "]\n",
+ "# fmt:on"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "1 2 L\n",
+ "3 4 F"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cond = data.eval(\n",
+ " \"\"\"\n",
+ " uid % 2 == 0 and \\\n",
+ " pid.str.isupper() and \\\n",
+ " pid != 'V'\n",
+ " \"\"\"\n",
+ ")\n",
+ "data.loc[cond]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ " code | \n",
+ " is_vip | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " O | \n",
+ " 1_O | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ " 2_L | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " k | \n",
+ " 3_k | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ " 4_F | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " Z | \n",
+ " 5_Z | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " u | \n",
+ " 6_u | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " t | \n",
+ " 7_t | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " V | \n",
+ " 8_V | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 9 | \n",
+ " x | \n",
+ " 9_x | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10 | \n",
+ " m | \n",
+ " 10_m | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid code is_vip\n",
+ "0 1 O 1_O True\n",
+ "1 2 L 2_L True\n",
+ "2 3 k 3_k False\n",
+ "3 4 F 4_F True\n",
+ "4 5 Z 5_Z True\n",
+ "5 6 u 6_u False\n",
+ "6 7 t 7_t False\n",
+ "7 8 V 8_V True\n",
+ "8 9 x 9_x False\n",
+ "9 10 m 10_m False"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.eval(\n",
+ " \"\"\"\n",
+ " uid = uid.astype('str')\n",
+ " code = uid.str.cat(pid, sep=\"_\")\n",
+ " is_vip = pid.str.isupper()\n",
+ " \"\"\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "1 2 L\n",
+ "3 4 F"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.query(\n",
+ " \"\"\"\n",
+ " uid % 2 == 0 and \\\n",
+ " pid.str.isupper() and \\\n",
+ " pid != 'V'\n",
+ " \"\"\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " uid | \n",
+ " pid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " L | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " F | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " uid pid\n",
+ "1 2 L\n",
+ "3 4 F"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data.query(\"\"\"uid % 2 == 0 and pid.str.isupper() and pid != 'V'\"\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3.10.4 ('sspai-100-hours-series-python')",
+ "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.4"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "7a101baf08afe636412f97dd4a9fc2e65b6f84f0ec50413bf3e19b04a26b8ba6"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/code/18/plot.ipynb b/code/18/plot.ipynb
new file mode 100644
index 0000000..1723be1
--- /dev/null
+++ b/code/18/plot.ipynb
@@ -0,0 +1,460 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "%matplotlib inline\n",
+ "%config InlineBackend.figure_format = 'svg'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "titanic = pd.read_csv(\"../../data/titanic.csv\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " PassengerId | \n",
+ " Survived | \n",
+ " Pclass | \n",
+ " Name | \n",
+ " Sex | \n",
+ " Age | \n",
+ " SibSp | \n",
+ " Parch | \n",
+ " Ticket | \n",
+ " Fare | \n",
+ " Cabin | \n",
+ " Embarked | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ " Braund, Mr. Owen Harris | \n",
+ " male | \n",
+ " 22.0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " A/5 21171 | \n",
+ " 7.2500 | \n",
+ " NaN | \n",
+ " S | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
+ " female | \n",
+ " 38.0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " PC 17599 | \n",
+ " 71.2833 | \n",
+ " C85 | \n",
+ " C | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " Heikkinen, Miss. Laina | \n",
+ " female | \n",
+ " 26.0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " STON/O2. 3101282 | \n",
+ " 7.9250 | \n",
+ " NaN | \n",
+ " S | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
+ " female | \n",
+ " 35.0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 113803 | \n",
+ " 53.1000 | \n",
+ " C123 | \n",
+ " S | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ " Allen, Mr. William Henry | \n",
+ " male | \n",
+ " 35.0 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 373450 | \n",
+ " 8.0500 | \n",
+ " NaN | \n",
+ " S | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PassengerId Survived Pclass \\\n",
+ "0 1 0 3 \n",
+ "1 2 1 1 \n",
+ "2 3 1 3 \n",
+ "3 4 1 1 \n",
+ "4 5 0 3 \n",
+ "\n",
+ " Name Sex Age SibSp \\\n",
+ "0 Braund, Mr. Owen Harris male 22.0 1 \n",
+ "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
+ "2 Heikkinen, Miss. Laina female 26.0 0 \n",
+ "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
+ "4 Allen, Mr. William Henry male 35.0 0 \n",
+ "\n",
+ " Parch Ticket Fare Cabin Embarked \n",
+ "0 0 A/5 21171 7.2500 NaN S \n",
+ "1 0 PC 17599 71.2833 C85 C \n",
+ "2 0 STON/O2. 3101282 7.9250 NaN S \n",
+ "3 0 113803 53.1000 C123 S \n",
+ "4 0 373450 8.0500 NaN S "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "titanic.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "titanic[\"Sex\"].value_counts().plot.bar()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[Text(0, 0, 'male'), Text(1, 0, 'female')]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "ax = titanic[\"Sex\"].value_counts().plot.bar()\n",
+ "ax.set_title(\"The Bar Chart of Sex\")\n",
+ "ax.set_xlabel(\"Sex\")\n",
+ "ax.set_ylabel(\"Counter\")\n",
+ "ax.set_xticklabels([\"male\", \"female\"], rotation=0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "titanic[\"Sex\"].value_counts().plot.pie()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "titanic[\"Sex\"].value_counts().plot.bar(\n",
+ " figsize=(8, 6),\n",
+ " title=\"The Bar Chart of Sex\",\n",
+ " rot=45,\n",
+ " xlabel=\"Sex\",\n",
+ " ylabel=\"Number\",\n",
+ " ylim=(0, 550),\n",
+ " legend=True,\n",
+ " fontsize=8.5,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from matplotlib import image\n",
+ "from matplotlib.offsetbox import OffsetImage\n",
+ "\n",
+ "\n",
+ "logo = image.imread(\"../../data/python-logo-master-v3-TM.png\")\n",
+ "\n",
+ "ax = titanic[\"Sex\"].value_counts().plot.pie(\n",
+ " figsize=(6, 8),\n",
+ " ylabel=\"\",\n",
+ " title=\"The Pie Chart of Sex\",\n",
+ " explode=(0, 0.05),\n",
+ " autopct=lambda pct: f\"{round(pct, 2)}%\",\n",
+ " pctdistance=0.4,\n",
+ " shadow=True,\n",
+ " colors=(\"steelblue\", \"orange\"),\n",
+ ")\n",
+ "\n",
+ "for n, tx in enumerate(ax.texts):\n",
+ " if (n+1) % 2==0:\n",
+ " tx.set_color(\"white\")\n",
+ "\n",
+ "logo_image = OffsetImage(logo, zoom=.5)\n",
+ "logo_image.set_offset((35, 25))\n",
+ "ax.add_artist(logo_image)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3.10.4 ('sspai-100-hours-series-python')",
+ "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.4"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "7a101baf08afe636412f97dd4a9fc2e65b6f84f0ec50413bf3e19b04a26b8ba6"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/data/python-logo-master-v3-TM.png b/data/python-logo-master-v3-TM.png
new file mode 100644
index 0000000000000000000000000000000000000000..71f942075dda7fb0b25cb28bfe6555e4ccbbe6dc
GIT binary patch
literal 83564
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