{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "B37A5E9D1472412A8A2348BCCD338B86",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "Pandas 是基于 NumPy 的一种数据处理工具，该工具为了解决数据分析任务而创建。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的函数和方法。\n",
    "这些练习着重DataFrame和Series对象的基本操作，包括数据的索引、分组、统计和清洗。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "408E7D614FB54B1D84A7B0A848C4C6F6",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## 基本操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EBBA275C49F24BAC8D5369F0674D34C6",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "1. 导入 Pandas 库并简写为 `pd`，并输出版本号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "id": "DC71C3CB19FA450D9A22B0501097C7D9",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.24.2'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "pd.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4BDAA047C88D4A7284FBB11C93331AF5",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "2.从列表创建 Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "id": "A3CE42AFF0F846F4831E88F2E4C5459B",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    1\n",
       "2    2\n",
       "3    3\n",
       "4    4\n",
       "dtype: int64"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = [0, 1, 2, 3, 4]\r\n",
    "df = pd.Series(arr) # 如果不指定索引，则默认从 0 开始\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "042776A6C0144F8785E71383B58BEBAC",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "3.从字典创建 Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "id": "F910769AB5F64648A25447A3785E82BF",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1\n",
       "b    2\n",
       "c    3\n",
       "d    4\n",
       "e    5\n",
       "dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = {'a':1,'b':2,'c':3,'d':4,'e':5}\r\n",
    "df = pd.Series(d)\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "36D50B633631470282A0E6323A76D2ED",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "4.从 NumPy 数组创建 DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "id": "43B11711239D40A6843D5CD1D3880030",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-11-25 19:52:19.649803</th>\n",
       "      <td>-2.030876</td>\n",
       "      <td>-1.268538</td>\n",
       "      <td>-0.558541</td>\n",
       "      <td>-0.900418</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-11-26 19:52:19.649803</th>\n",
       "      <td>-1.527629</td>\n",
       "      <td>-0.703445</td>\n",
       "      <td>0.101752</td>\n",
       "      <td>0.847650</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-11-27 19:52:19.649803</th>\n",
       "      <td>1.778669</td>\n",
       "      <td>-0.726840</td>\n",
       "      <td>0.179889</td>\n",
       "      <td>0.900710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-11-28 19:52:19.649803</th>\n",
       "      <td>0.632184</td>\n",
       "      <td>0.156482</td>\n",
       "      <td>0.865383</td>\n",
       "      <td>-1.155356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-11-29 19:52:19.649803</th>\n",
       "      <td>0.092894</td>\n",
       "      <td>0.157272</td>\n",
       "      <td>-1.733493</td>\n",
       "      <td>-1.259203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-11-30 19:52:19.649803</th>\n",
       "      <td>-1.937439</td>\n",
       "      <td>0.120771</td>\n",
       "      <td>-1.964980</td>\n",
       "      <td>-1.700180</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                   A         B         C         D\n",
       "2020-11-25 19:52:19.649803 -2.030876 -1.268538 -0.558541 -0.900418\n",
       "2020-11-26 19:52:19.649803 -1.527629 -0.703445  0.101752  0.847650\n",
       "2020-11-27 19:52:19.649803  1.778669 -0.726840  0.179889  0.900710\n",
       "2020-11-28 19:52:19.649803  0.632184  0.156482  0.865383 -1.155356\n",
       "2020-11-29 19:52:19.649803  0.092894  0.157272 -1.733493 -1.259203\n",
       "2020-11-30 19:52:19.649803 -1.937439  0.120771 -1.964980 -1.700180"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dates = pd.date_range('today',periods=6) # 定义时间序列作为 index\r\n",
    "num_arr = np.random.randn(6,4) # 传入 numpy 随机数组\r\n",
    "columns = ['A','B','C','D'] # 将列表作为列名\r\n",
    "df1 = pd.DataFrame(num_arr, index = dates, columns = columns)\r\n",
    "df1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "D7D785E5CA3C497C8C4765D984432CD8",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "5.从CSV中创建 DataFrame，分隔符为`;`，编码格式为`gbk`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "id": "4F16DA0868BF484A85F9E690ADD9E4AD",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# df = pd.read_csv('test.csv', encoding='gbk, sep=';')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2E270529EBA14E9583C308DFBED813F0",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "6.从字典对象`data`创建DataFrame，设置索引为`labels`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "id": "4C7745E1545D40A4B1DF01B9FACAB322",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\r\n",
    "\r\n",
    "data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],\r\n",
    "        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],\r\n",
    "        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],\r\n",
    "        'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}\r\n",
    "\r\n",
    "labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "id": "E2097C5B292B484A97D18AE44387A1A2",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>2.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>no</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "a  2.5    cat      yes       1\n",
       "b  3.0    cat      yes       3\n",
       "c  0.5  snake       no       2\n",
       "d  NaN    dog      yes       3\n",
       "e  5.0    dog       no       2\n",
       "f  2.0    cat       no       3\n",
       "g  4.5  snake       no       1\n",
       "h  NaN    cat      yes       1\n",
       "i  7.0    dog       no       2\n",
       "j  3.0    dog       no       1"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(data, index=labels)\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "D1973CA623394A5F8C3F356AD4D5F98B",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "7.显示DataFrame的基础信息，包括行的数量；列名；每一列值的数量、类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "id": "704A3A9393CA4C3BBFC4382B2AC013ED",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Index: 10 entries, a to j\n",
      "Data columns (total 4 columns):\n",
      "age         8 non-null float64\n",
      "animal      10 non-null object\n",
      "priority    10 non-null object\n",
      "visits      10 non-null int64\n",
      "dtypes: float64(1), int64(1), object(2)\n",
      "memory usage: 400.0+ bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()\r\n",
    "# 方法二\r\n",
    "# df.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ABD97C9AF1AF4F808D803BC99DDB42A0",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "8.展示`df`的前3行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "id": "174EEA3F312E492B8194DB974137AC9F",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "a  2.5    cat      yes       1\n",
       "b  3.0    cat      yes       3\n",
       "c  0.5  snake       no       2"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:3]\r\n",
    "# 方法二\r\n",
    "#df.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C746F0B208A544F8869B7BEA45C0D604",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "9.取出`df`的`animal`和`age`列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "id": "5C0327B056874AB3A61AA67A0700D026",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>animal</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>cat</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>cat</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>snake</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>dog</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>dog</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>cat</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>snake</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>cat</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>dog</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>dog</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  animal  age\n",
       "a    cat  2.5\n",
       "b    cat  3.0\n",
       "c  snake  0.5\n",
       "d    dog  NaN\n",
       "e    dog  5.0\n",
       "f    cat  2.0\n",
       "g  snake  4.5\n",
       "h    cat  NaN\n",
       "i    dog  7.0\n",
       "j    dog  3.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[:, ['animal', 'age']]\r\n",
    "# 方法二\r\n",
    "# df[['animal', 'age']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "A7C3AECC6B4C418683E826866F2A00BF",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "10.取出索引为`[3, 4, 8]`行的`animal`和`age`列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "id": "28628128E7AD42A28F2235E36E81DC82",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>animal</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>dog</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>dog</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>dog</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  animal  age\n",
       "d    dog  NaN\n",
       "e    dog  5.0\n",
       "i    dog  7.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[df.index[[3, 4, 8]], ['animal', 'age']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0DC73A3BAEE1471488F497ADAAECE9A4",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "11.取出`age`值大于3的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "id": "5F6C4EBC5CAB46868AB9B6752AFE51B1",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "e  5.0    dog       no       2\n",
       "g  4.5  snake       no       1\n",
       "i  7.0    dog       no       2"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['age'] > 3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "B58686B7272F471A8C3CA3BBABF8CFDB",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "12.取出`age`值缺失的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "id": "88C1B731BFB646EAA76E284E472AA440",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "d  NaN    dog      yes       3\n",
       "h  NaN    cat      yes       1"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['age'].isnull()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4F4812626E7F491CAF83EB425A452595",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "13.取出`age`在2,4间的行（不含）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "id": "C8CEA4CE37984E0783711C683257CCBA",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "a  2.5    cat      yes       1\n",
       "b  3.0    cat      yes       3\n",
       "j  3.0    dog       no       1"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[(df['age']>2) & (df['age']<4)]\n",
    "# 方法二\n",
    "#df[df['age'].between(2, 4)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EC4A3E47A9F94C94BC1EA9BD25CB2AC3",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "14.`f`行的`age`改为1.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "id": "749484D2F77E4F6A8C03820E772432DE",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "df.loc['f', 'age'] = 1.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4785E429ACA04385835A814AFF4F59A0",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "15.计算`visits`的总和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "id": "37AD6C06B30947428FF7DDD1F7C39838",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "19"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['visits'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "512DCEC2028848C89E03A41E555A167E",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "16.计算每个不同种类`animal`的`age`的平均数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "id": "31E587F50D69457ABC853375B8CBE1AF",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "animal\n",
       "cat      2.333333\n",
       "dog      5.000000\n",
       "snake    2.500000\n",
       "Name: age, dtype: float64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('animal')['age'].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "F1C3C328E8624CE5B6B93BAFE03652D8",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "17.计算`df`中每个种类`animal`的数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "id": "E085A0DFC1F94C749D3234D0F86ABCBA",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cat      4\n",
       "dog      4\n",
       "snake    2\n",
       "Name: animal, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['animal'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C242DEBB812846F592335C1CEDD7DBE7",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "18.先按`age`降序排列，后按`visits`升序排列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false,
    "id": "1743410F4F2E4AA48DA1BAD60AAEFFB6",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>1.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>no</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>yes</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal priority  visits\n",
       "i  7.0    dog       no       2\n",
       "e  5.0    dog       no       2\n",
       "g  4.5  snake       no       1\n",
       "j  3.0    dog       no       1\n",
       "b  3.0    cat      yes       3\n",
       "a  2.5    cat      yes       1\n",
       "f  1.5    cat       no       3\n",
       "c  0.5  snake       no       2\n",
       "h  NaN    cat      yes       1\n",
       "d  NaN    dog      yes       3"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values(by=['age', 'visits'], ascending=[False, True])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8DAC0489BCF345D18722936760521D10",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "19.将`priority`列中的`yes, no`替换为布尔值`True, False`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false,
    "id": "7AC076FE991A4A7C86C270465AEEC2A5",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>1.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>False</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>snake</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age animal  priority  visits\n",
       "a  2.5    cat      True       1\n",
       "b  3.0    cat      True       3\n",
       "c  0.5  snake     False       2\n",
       "d  NaN    dog      True       3\n",
       "e  5.0    dog     False       2\n",
       "f  1.5    cat     False       3\n",
       "g  4.5  snake     False       1\n",
       "h  NaN    cat      True       1\n",
       "i  7.0    dog     False       2\n",
       "j  3.0    dog     False       1"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['priority'] = df['priority'].map({'yes': True, 'no': False})\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "011AD6B2DB3F4FF68B6BF78C17606F13",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "20.将`animal`列中的`snake`替换为`python`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "id": "BB3E112D297445688FF0BBD9A7EE7E27",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>python</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>1.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>False</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>python</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  animal  priority  visits\n",
       "a  2.5     cat      True       1\n",
       "b  3.0     cat      True       3\n",
       "c  0.5  python     False       2\n",
       "d  NaN     dog      True       3\n",
       "e  5.0     dog     False       2\n",
       "f  1.5     cat     False       3\n",
       "g  4.5  python     False       1\n",
       "h  NaN     cat      True       1\n",
       "i  7.0     dog     False       2\n",
       "j  3.0     dog     False       1"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['animal'] = df['animal'].replace('snake', 'python')\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3BA3F97990E346A5836836864EB4FFB8",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "21.对每种`animal`的每种不同数量`visits`，计算平均`age`，即，返回一个表格，行是`aniaml`种类，列是`visits`数量，表格值是行动物种类列访客数量的平均年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "id": "AF5A8AAAB4884450B89A9544B40DD4ED",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age         float64\n",
       "animal       object\n",
       "priority       bool\n",
       "visits        int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "id": "83C7501AF44F47AA8E5258652FDF9988",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "df.age=df.age.astype(float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false,
    "id": "E784D19B88B3426498F0B41FCC4290C6",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>visits</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>animal</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cat</th>\n",
       "      <td>2.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dog</th>\n",
       "      <td>3.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>python</th>\n",
       "      <td>4.5</td>\n",
       "      <td>0.5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "visits    1    2     3\n",
       "animal                \n",
       "cat     2.5  NaN  2.25\n",
       "dog     3.0  6.0   NaN\n",
       "python  4.5  0.5   NaN"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.pivot_table(index='animal', columns='visits', values='age', aggfunc='mean')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "54EC83F0A5AC41D88DEB3D986A9F608C",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "22.在`df`中插入新行`k`，然后删除该行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false,
    "id": "8CCB1591219B4CA983EEF993924C726C",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>animal</th>\n",
       "      <th>priority</th>\n",
       "      <th>visits</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>2.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3.0</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>0.5</td>\n",
       "      <td>python</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>dog</td>\n",
       "      <td>True</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>5.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>1.5</td>\n",
       "      <td>cat</td>\n",
       "      <td>False</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>4.5</td>\n",
       "      <td>python</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>NaN</td>\n",
       "      <td>cat</td>\n",
       "      <td>True</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>i</th>\n",
       "      <td>7.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>j</th>\n",
       "      <td>3.0</td>\n",
       "      <td>dog</td>\n",
       "      <td>False</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  animal priority  visits\n",
       "a  2.5     cat     True       1\n",
       "b  3.0     cat     True       3\n",
       "c  0.5  python    False       2\n",
       "d  NaN     dog     True       3\n",
       "e  5.0     dog    False       2\n",
       "f  1.5     cat    False       3\n",
       "g  4.5  python    False       1\n",
       "h  NaN     cat     True       1\n",
       "i  7.0     dog    False       2\n",
       "j  3.0     dog    False       1"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#插入\r\n",
    "df.loc['k'] = [5.5, 'dog', 'no', 2]\r\n",
    "# 删除\r\n",
    "df = df.drop('k')\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "E4BF6769090045D9BBAA73B83A6D0304",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## 进阶操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EC5E11D6D5E745CA888128DC64E933B9",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "23.有一列整数列`A`的DatraFrame，删除数值重复的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "id": "E64946439A524AF8817063EF7C3B9AC3",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    A\n",
      "0   1\n",
      "1   2\n",
      "2   2\n",
      "3   3\n",
      "4   4\n",
      "5   5\n",
      "6   5\n",
      "7   5\n",
      "8   6\n",
      "9   7\n",
      "10  7\n",
      "   A\n",
      "0  1\n",
      "1  2\n",
      "3  3\n",
      "4  4\n",
      "5  5\n",
      "8  6\n",
      "9  7\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})\n",
    "print(df)\n",
    "df1 = df.loc[df['A'].shift() != df['A']]\n",
    "# 方法二\n",
    "# df1 = df.drop_duplicates(subset='A')\n",
    "print(df1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "52EF04D119B045D29071C0635CBF854D",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "24.一个全数值DatraFrame，每个数字减去该行的平均数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false,
    "id": "50FEE2500BC64CBA8EB44425860DAA9C",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          0         1         2\n",
      "0  0.414453  0.332157  0.856186\n",
      "1  0.163896  0.089443  0.593890\n",
      "2  0.526212  0.781033  0.299327\n",
      "3  0.405021  0.890150  0.575210\n",
      "4  0.516062  0.485737  0.584763\n",
      "          0         1         2\n",
      "0 -0.119812 -0.202108  0.321921\n",
      "1 -0.118514 -0.192967  0.311480\n",
      "2 -0.009312  0.245509 -0.236198\n",
      "3 -0.218440  0.266689 -0.048250\n",
      "4 -0.012792 -0.043117  0.055909\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.random(size=(5, 3)))\n",
    "print(df)\n",
    "df1 = df.sub(df.mean(axis=1), axis=0)\n",
    "print(df1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "935456754362412684F8A7DB2BB264DE",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "25.一个有5列的DataFrame，求哪一列的和最小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false,
    "id": "81B9F18E6DD94167B6D304E54DBBE7BD",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          a         b         c         d         e\n",
      "0  0.497311  0.702727  0.317818  0.246678  0.761391\n",
      "1  0.757598  0.135243  0.023186  0.181558  0.360602\n",
      "2  0.002264  0.116232  0.221348  0.717638  0.289913\n",
      "3  0.048115  0.909258  0.013615  0.080099  0.722705\n",
      "4  0.138972  0.687775  0.540898  0.306161  0.444953\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'c'"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.random(size=(5, 5)), columns=list('abcde'))\n",
    "print(df)\n",
    "df.sum().idxmin()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "7418298827EF4DE18D88D79ABEE3389C",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "26.给定DataFrame，求`A`列每个值的前3大的`B`的和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false,
    "id": "E3316FCA37B04ECF94808EACA6702994",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    A    B\n",
      "0   a   12\n",
      "1   a  345\n",
      "2   a    3\n",
      "3   b    1\n",
      "4   b   45\n",
      "5   c   14\n",
      "6   a    4\n",
      "7   a   52\n",
      "8   b   54\n",
      "9   c   23\n",
      "10  c  235\n",
      "11  c   21\n",
      "12  b   57\n",
      "13  b    3\n",
      "14  c   87\n",
      "A\n",
      "a    409\n",
      "b    156\n",
      "c    345\n",
      "Name: B, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'A': list('aaabbcaabcccbbc'), \r\n",
    "                   'B': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})\r\n",
    "print(df)\r\n",
    "df1 = df.groupby('A')['B'].nlargest(3).sum(level=0)\r\n",
    "print(df1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "42417D37787F4199A3A7B4E35F691433",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "27.给定DataFrame，有列`A, B`，`A`的值在1-100（含），对`A`列每10步长，求对应的`B`的和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false,
    "id": "226877047B334FC7A3F075152E048FF6",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    A   B\n",
      "0   1   1\n",
      "1   2   2\n",
      "2  11  11\n",
      "3  11  11\n",
      "4  33  33\n",
      "5  34  34\n",
      "6  35  35\n",
      "7  40  40\n",
      "8  79  79\n",
      "9  99  99\n",
      "A\n",
      "(0, 10]        3\n",
      "(10, 20]      22\n",
      "(20, 30]       0\n",
      "(30, 40]     142\n",
      "(40, 50]       0\n",
      "(50, 60]       0\n",
      "(60, 70]       0\n",
      "(70, 80]      79\n",
      "(80, 90]       0\n",
      "(90, 100]     99\n",
      "Name: B, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'A': [1,2,11,11,33,34,35,40,79,99], \r\n",
    "                   'B': [1,2,11,11,33,34,35,40,79,99]})\r\n",
    "print(df)\r\n",
    "df1 = df.groupby(pd.cut(df['A'], np.arange(0, 101, 10)))['B'].sum()\r\n",
    "print(df1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4A41563F4E83421E99DC691CDCBF1B5F",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "28.给定DataFrame，计算每个元素至左边最近的`0`（或者至开头）的距离，生成新列`y`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false,
    "id": "83E7FDD067C546ED8FC7260C12CB49D4",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   X  Y\n",
      "0  7  1\n",
      "1  2  2\n",
      "2  0  0\n",
      "3  3  1\n",
      "4  4  2\n",
      "5  2  3\n",
      "6  5  4\n",
      "7  0  0\n",
      "8  3  1\n",
      "9  4  2\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]})\n",
    "\n",
    "izero = np.r_[-1, (df['X'] == 0).to_numpy().nonzero()[0]] # 标记0的位置\n",
    "idx = np.arange(len(df))\n",
    "df['Y'] = idx - izero[np.searchsorted(izero - 1, idx) - 1]\n",
    "print(df)\n",
    "\n",
    "# 方法二\n",
    "# x = (df['X'] != 0).cumsum()\n",
    "# y = x != x.shift()\n",
    "# df['Y'] = y.groupby((y != y.shift()).cumsum()).cumsum()\n",
    "\n",
    "# 方法三\n",
    "# df['Y'] = df.groupby((df['X'] == 0).cumsum()).cumcount()\n",
    "#first_zero_idx = (df['X'] == 0).idxmax()\n",
    "# df['Y'].iloc[0:first_zero_idx] += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C6EFAC00D81F4F629784CC2C59AAC6AB",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "29.一个全数值的DataFrame，返回最大3值的坐标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "id": "5C3C6B1686744DAD89695A3071E6F68B",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          0         1         2\n",
      "0  0.357183  0.569268  0.115802\n",
      "1  0.605917  0.881550  0.593334\n",
      "2  0.830468  0.072343  0.661204\n",
      "3  0.811008  0.985117  0.550789\n",
      "4  0.091020  0.296938  0.421596\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[(0, 2), (1, 1), (1, 3)]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.random(size=(5, 3)))\n",
    "print(df)\n",
    "df.unstack().sort_values()[-3:].index.tolist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "175D476BB4A24A74A99286D21B6BA1A2",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "30.给定DataFrame，将负值代替为同组的平均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "id": "553E4F00BFB44D968D1D87C4479B90D1",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   grps  vals\n",
      "0     a   -12\n",
      "1     a   345\n",
      "2     a     3\n",
      "3     b     1\n",
      "4     b    45\n",
      "5     c    14\n",
      "6     a     4\n",
      "7     a   -52\n",
      "8     b    54\n",
      "9     c    23\n",
      "10    c  -235\n",
      "11    c    21\n",
      "12    b    57\n",
      "13    b     3\n",
      "14    c    87\n",
      "   grps        vals\n",
      "0     a  117.333333\n",
      "1     a  345.000000\n",
      "2     a    3.000000\n",
      "3     b    1.000000\n",
      "4     b   45.000000\n",
      "5     c   14.000000\n",
      "6     a    4.000000\n",
      "7     a  117.333333\n",
      "8     b   54.000000\n",
      "9     c   23.000000\n",
      "10    c   36.250000\n",
      "11    c   21.000000\n",
      "12    b   57.000000\n",
      "13    b    3.000000\n",
      "14    c   87.000000\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'), \r\n",
    "                   'vals': [-12,345,3,1,45,14,4,-52,54,23,-235,21,57,3,87]})\r\n",
    "print(df)\r\n",
    "\r\n",
    "def replace(group):\r\n",
    "    mask = group<0\r\n",
    "    group[mask] = group[~mask].mean()\r\n",
    "    return group\r\n",
    "\r\n",
    "df['vals'] = df.groupby(['grps'])['vals'].transform(replace)\r\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "531D55E9C6104DD68D133D310A9C6ADF",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "31.计算3位滑动窗口的平均值，忽略NAN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false,
    "id": "FB5B855534524B3185737D4B9840F377",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   group  value\n",
      "0      a    1.0\n",
      "1      a    2.0\n",
      "2      b    3.0\n",
      "3      b    NaN\n",
      "4      a    2.0\n",
      "5      b    3.0\n",
      "6      b    NaN\n",
      "7      b    1.0\n",
      "8      a    7.0\n",
      "9      b    3.0\n",
      "10     a    NaN\n",
      "11     b    8.0\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0     1.000000\n",
       "1     1.500000\n",
       "2     3.000000\n",
       "3     3.000000\n",
       "4     1.666667\n",
       "5     3.000000\n",
       "6     3.000000\n",
       "7     2.000000\n",
       "8     3.666667\n",
       "9     2.000000\n",
       "10    4.500000\n",
       "11    4.000000\n",
       "Name: value, dtype: float64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'group': list('aabbabbbabab'),\r\n",
    "                    'value': [1, 2, 3, np.nan, 2, 3, np.nan, 1, 7, 3, np.nan, 8]})\r\n",
    "print(df)\r\n",
    "\r\n",
    "g1 = df.groupby(['group'])['value']\r\n",
    "g2 = df.fillna(0).groupby(['group'])['value'] \r\n",
    "\r\n",
    "s = g2.rolling(3, min_periods=1).sum() / g1.rolling(3, min_periods=1).count()\r\n",
    "\r\n",
    "s.reset_index(level=0, drop=True).sort_index() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0F3BEA0769BA46EE9663284836B66CBC",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## Series 和 Datetime索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C2D533ADDA924DCA8D6F0738301A925C",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "32.创建Series `s`，将2015所有工作日作为随机值的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false,
    "id": "D0C59B606E07405280B76B7BAA0D4DDA",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2015-01-01    0.896401\n",
       "2015-01-02    0.789480\n",
       "2015-01-05    0.271381\n",
       "2015-01-06    0.740503\n",
       "2015-01-07    0.241424\n",
       "2015-01-08    0.644122\n",
       "2015-01-09    0.599708\n",
       "2015-01-12    0.714903\n",
       "2015-01-13    0.285152\n",
       "2015-01-14    0.574001\n",
       "Freq: B, dtype: float64"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dti = pd.date_range(start='2015-01-01', end='2015-12-31', freq='B') \r\n",
    "s = pd.Series(np.random.rand(len(dti)), index=dti)\r\n",
    "\r\n",
    "s.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5EE211F6B1384974BB98801E9D7F4FE7",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "33.所有礼拜三的值求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "id": "2608EBB1A445402E823F8DB819B99022",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27.08213095254659"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s[s.index.weekday == 2].sum() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "358A1965800B4B4D8A018A4C70B70FB5",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "34.求每个自然月的平均数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false,
    "id": "DE356545760A481E8E164FF508569B1F",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2015-01-31    0.474092\n",
       "2015-02-28    0.421380\n",
       "2015-03-31    0.676973\n",
       "2015-04-30    0.427968\n",
       "2015-05-31    0.638426\n",
       "2015-06-30    0.561239\n",
       "2015-07-31    0.536794\n",
       "2015-08-31    0.500563\n",
       "2015-09-30    0.548050\n",
       "2015-10-31    0.592157\n",
       "2015-11-30    0.467826\n",
       "2015-12-31    0.548842\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.resample('M').mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5FDC751CEE534FDE9854536036EB49F5",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "35.每连续4个月为一组，求最大值所在的日期"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false,
    "id": "93F635653DD14D29B7166D896B7F02E9",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2015-01-31   2015-01-01\n",
       "2015-05-31   2015-03-11\n",
       "2015-09-30   2015-07-03\n",
       "2016-01-31   2015-11-23\n",
       "Freq: 4M, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.groupby(pd.Grouper(freq='4M')).idxmax()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "521B75EA73834A02AD0C21929A503AB3",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "36.创建2015-2016每月第三个星期四的序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false,
    "id": "06CC1162D5BC4D348F579609DDA184DC",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2015-01-15', '2015-02-19', '2015-03-19', '2015-04-16',\n",
       "               '2015-05-21', '2015-06-18', '2015-07-16', '2015-08-20',\n",
       "               '2015-09-17', '2015-10-15', '2015-11-19', '2015-12-17',\n",
       "               '2016-01-21', '2016-02-18', '2016-03-17', '2016-04-21',\n",
       "               '2016-05-19', '2016-06-16', '2016-07-21', '2016-08-18',\n",
       "               '2016-09-15', '2016-10-20', '2016-11-17', '2016-12-15'],\n",
       "              dtype='datetime64[ns]', freq='WOM-3THU')"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.date_range('2015-01-01', '2016-12-31', freq='WOM-3THU')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0A6698CC0BE34C849855C4A507E38C17",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## 数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false,
    "id": "781F1B8BEA8F43D59E5E6F31923398F9",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>From_To</th>\n",
       "      <th>RecentDelays</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM(!)</td>\n",
       "      <td>10045.0</td>\n",
       "      <td>LoNDon_paris</td>\n",
       "      <td>[23, 47]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>&lt;Air France&gt; (12)</td>\n",
       "      <td>NaN</td>\n",
       "      <td>MAdrid_miLAN</td>\n",
       "      <td>[]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(British Airways. )</td>\n",
       "      <td>10065.0</td>\n",
       "      <td>londON_StockhOlm</td>\n",
       "      <td>[24, 43, 87]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>12. Air France</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Budapest_PaRis</td>\n",
       "      <td>[13]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Swiss Air\"</td>\n",
       "      <td>10085.0</td>\n",
       "      <td>Brussels_londOn</td>\n",
       "      <td>[67, 32]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               Airline  FlightNumber           From_To  RecentDelays\n",
       "0               KLM(!)       10045.0      LoNDon_paris      [23, 47]\n",
       "1    <Air France> (12)           NaN      MAdrid_miLAN            []\n",
       "2  (British Airways. )       10065.0  londON_StockhOlm  [24, 43, 87]\n",
       "3       12. Air France           NaN    Budapest_PaRis          [13]\n",
       "4          \"Swiss Air\"       10085.0   Brussels_londOn      [67, 32]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm', \r\n",
    "                               'Budapest_PaRis', 'Brussels_londOn'],\r\n",
    "              'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],\r\n",
    "              'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],\r\n",
    "                   'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )', \r\n",
    "                               '12. Air France', '\"Swiss Air\"']})\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "A5514B83AF294CEA9A91F4EBD70829CF",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "37.`FlightNumber`列中有些值缺失了，他们本来应该是每一行增加10，填充缺失的数值，并且令数据类型为整数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false,
    "id": "C966348861274DED830F3D0A78E72273",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>From_To</th>\n",
       "      <th>RecentDelays</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM(!)</td>\n",
       "      <td>10045</td>\n",
       "      <td>LoNDon_paris</td>\n",
       "      <td>[23, 47]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>&lt;Air France&gt; (12)</td>\n",
       "      <td>10055</td>\n",
       "      <td>MAdrid_miLAN</td>\n",
       "      <td>[]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(British Airways. )</td>\n",
       "      <td>10065</td>\n",
       "      <td>londON_StockhOlm</td>\n",
       "      <td>[24, 43, 87]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>12. Air France</td>\n",
       "      <td>10075</td>\n",
       "      <td>Budapest_PaRis</td>\n",
       "      <td>[13]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Swiss Air\"</td>\n",
       "      <td>10085</td>\n",
       "      <td>Brussels_londOn</td>\n",
       "      <td>[67, 32]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               Airline  FlightNumber           From_To  RecentDelays\n",
       "0               KLM(!)         10045      LoNDon_paris      [23, 47]\n",
       "1    <Air France> (12)         10055      MAdrid_miLAN            []\n",
       "2  (British Airways. )         10065  londON_StockhOlm  [24, 43, 87]\n",
       "3       12. Air France         10075    Budapest_PaRis          [13]\n",
       "4          \"Swiss Air\"         10085   Brussels_londOn      [67, 32]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DF2998C5B9FB4C838CC6B9E8C3D69739",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "38.将`From_To`列从`_`分开，分成`From, To`两列，并删除原始列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "id": "9C6E47AB6E4746ABAFF4A5AE4BB15C5B",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>RecentDelays</th>\n",
       "      <th>From</th>\n",
       "      <th>To</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM(!)</td>\n",
       "      <td>10045</td>\n",
       "      <td>[23, 47]</td>\n",
       "      <td>LoNDon</td>\n",
       "      <td>paris</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>&lt;Air France&gt; (12)</td>\n",
       "      <td>10055</td>\n",
       "      <td>[]</td>\n",
       "      <td>MAdrid</td>\n",
       "      <td>miLAN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(British Airways. )</td>\n",
       "      <td>10065</td>\n",
       "      <td>[24, 43, 87]</td>\n",
       "      <td>londON</td>\n",
       "      <td>StockhOlm</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>12. Air France</td>\n",
       "      <td>10075</td>\n",
       "      <td>[13]</td>\n",
       "      <td>Budapest</td>\n",
       "      <td>PaRis</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Swiss Air\"</td>\n",
       "      <td>10085</td>\n",
       "      <td>[67, 32]</td>\n",
       "      <td>Brussels</td>\n",
       "      <td>londOn</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               Airline  FlightNumber  RecentDelays      From         To\n",
       "0               KLM(!)         10045      [23, 47]    LoNDon      paris\n",
       "1    <Air France> (12)         10055            []    MAdrid      miLAN\n",
       "2  (British Airways. )         10065  [24, 43, 87]    londON  StockhOlm\n",
       "3       12. Air France         10075          [13]  Budapest      PaRis\n",
       "4          \"Swiss Air\"         10085      [67, 32]  Brussels     londOn"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "temp = df.From_To.str.split('_', expand=True)\r\n",
    "temp.columns = ['From', 'To']\r\n",
    "df = df.join(temp)\r\n",
    "df = df.drop('From_To', axis=1)\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6158CB82BEFF471186E695AFCF141578",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "39.将`From, To`大小写统一"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false,
    "id": "723B7E56837A4D1AB35FB629F4EA27F7",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>RecentDelays</th>\n",
       "      <th>From</th>\n",
       "      <th>To</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM(!)</td>\n",
       "      <td>10045</td>\n",
       "      <td>[23, 47]</td>\n",
       "      <td>London</td>\n",
       "      <td>Paris</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>&lt;Air France&gt; (12)</td>\n",
       "      <td>10055</td>\n",
       "      <td>[]</td>\n",
       "      <td>Madrid</td>\n",
       "      <td>Milan</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(British Airways. )</td>\n",
       "      <td>10065</td>\n",
       "      <td>[24, 43, 87]</td>\n",
       "      <td>London</td>\n",
       "      <td>Stockholm</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>12. Air France</td>\n",
       "      <td>10075</td>\n",
       "      <td>[13]</td>\n",
       "      <td>Budapest</td>\n",
       "      <td>Paris</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Swiss Air\"</td>\n",
       "      <td>10085</td>\n",
       "      <td>[67, 32]</td>\n",
       "      <td>Brussels</td>\n",
       "      <td>London</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               Airline  FlightNumber  RecentDelays      From         To\n",
       "0               KLM(!)         10045      [23, 47]    London      Paris\n",
       "1    <Air France> (12)         10055            []    Madrid      Milan\n",
       "2  (British Airways. )         10065  [24, 43, 87]    London  Stockholm\n",
       "3       12. Air France         10075          [13]  Budapest      Paris\n",
       "4          \"Swiss Air\"         10085      [67, 32]  Brussels     London"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['From'] = df['From'].str.capitalize()\r\n",
    "df['To'] = df['To'].str.capitalize()\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4E3A3DA70FC34F01ACA10F535844B079",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "40.`Airline`列，有一些多余的标点符号，需要提取出正确的航司名称。举例：`'(British Airways. )'` 应该改为 `'British Airways'`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false,
    "id": "9F9F0D09D80F4B8E837F4ABB09DBC76C",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>RecentDelays</th>\n",
       "      <th>From</th>\n",
       "      <th>To</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM</td>\n",
       "      <td>10045</td>\n",
       "      <td>[23, 47]</td>\n",
       "      <td>London</td>\n",
       "      <td>Paris</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Air France</td>\n",
       "      <td>10055</td>\n",
       "      <td>[]</td>\n",
       "      <td>Madrid</td>\n",
       "      <td>Milan</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>British Airways</td>\n",
       "      <td>10065</td>\n",
       "      <td>[24, 43, 87]</td>\n",
       "      <td>London</td>\n",
       "      <td>Stockholm</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Air France</td>\n",
       "      <td>10075</td>\n",
       "      <td>[13]</td>\n",
       "      <td>Budapest</td>\n",
       "      <td>Paris</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Swiss Air</td>\n",
       "      <td>10085</td>\n",
       "      <td>[67, 32]</td>\n",
       "      <td>Brussels</td>\n",
       "      <td>London</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           Airline  FlightNumber  RecentDelays      From         To\n",
       "0              KLM         10045      [23, 47]    London      Paris\n",
       "1       Air France         10055            []    Madrid      Milan\n",
       "2  British Airways         10065  [24, 43, 87]    London  Stockholm\n",
       "3       Air France         10075          [13]  Budapest      Paris\n",
       "4        Swiss Air         10085      [67, 32]  Brussels     London"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['Airline'] = df['Airline'].str.extract('([a-zA-Z\\s]+)', expand=False).str.strip()\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2433A20C6E6D47E381B6EB1B738F8577",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "41.`Airline`列，数据被以列表的形式录入，但是我们希望每个数字被录入成单独一列，`delay_1, delay_2, ...`没有的用NAN替代。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false,
    "id": "F779D702D1BD4C4082DBDF2D31BA7D57",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Airline</th>\n",
       "      <th>FlightNumber</th>\n",
       "      <th>From</th>\n",
       "      <th>To</th>\n",
       "      <th>delay_1</th>\n",
       "      <th>delay_2</th>\n",
       "      <th>delay_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>KLM</td>\n",
       "      <td>10045</td>\n",
       "      <td>London</td>\n",
       "      <td>Paris</td>\n",
       "      <td>23.0</td>\n",
       "      <td>47.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Air France</td>\n",
       "      <td>10055</td>\n",
       "      <td>Madrid</td>\n",
       "      <td>Milan</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>British Airways</td>\n",
       "      <td>10065</td>\n",
       "      <td>London</td>\n",
       "      <td>Stockholm</td>\n",
       "      <td>24.0</td>\n",
       "      <td>43.0</td>\n",
       "      <td>87.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Air France</td>\n",
       "      <td>10075</td>\n",
       "      <td>Budapest</td>\n",
       "      <td>Paris</td>\n",
       "      <td>13.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Swiss Air</td>\n",
       "      <td>10085</td>\n",
       "      <td>Brussels</td>\n",
       "      <td>London</td>\n",
       "      <td>67.0</td>\n",
       "      <td>32.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           Airline  FlightNumber      From         To  delay_1  delay_2  \\\n",
       "0              KLM         10045    London      Paris     23.0     47.0   \n",
       "1       Air France         10055    Madrid      Milan      NaN      NaN   \n",
       "2  British Airways         10065    London  Stockholm     24.0     43.0   \n",
       "3       Air France         10075  Budapest      Paris     13.0      NaN   \n",
       "4        Swiss Air         10085  Brussels     London     67.0     32.0   \n",
       "\n",
       "   delay_3  \n",
       "0      NaN  \n",
       "1      NaN  \n",
       "2     87.0  \n",
       "3      NaN  \n",
       "4      NaN  "
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "delays = df['RecentDelays'].apply(pd.Series)\r\n",
    "delays.columns = ['delay_{}'.format(n) for n in range(1, len(delays.columns)+1)]\r\n",
    "df = df.drop('RecentDelays', axis=1).join(delays)\r\n",
    "\r\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EBEC4771C87D4E94837A07FBC3D2FB86",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## 层次化索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "365219BB0A2142F789CD512EC8DD8DA0",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "42.用 `letters = ['A', 'B', 'C']` 和 `numbers = list(range(10))`的组合作为系列随机值的层次化索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false,
    "id": "3941AB87138449D4839163AAA610B79B",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A  0    0.950249\n",
       "   1    0.726566\n",
       "   2    0.495760\n",
       "   3    0.905605\n",
       "B  0    0.004121\n",
       "   1    0.626741\n",
       "   2    0.121265\n",
       "   3    0.241187\n",
       "C  0    0.595867\n",
       "   1    0.840930\n",
       "   2    0.102324\n",
       "   3    0.354690\n",
       "dtype: float64"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "letters = ['A', 'B', 'C']\r\n",
    "numbers = list(range(4))\r\n",
    "\r\n",
    "mi = pd.MultiIndex.from_product([letters, numbers])\r\n",
    "s = pd.Series(np.random.rand(12), index=mi)\r\n",
    "s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1C32A5A6E21B46438E6C74362326396E",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "43.检查`s`是否是字典顺序排序的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false,
    "id": "A5E45FD54216448494C431702C75F220",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.index.is_lexsorted()\n",
    "# 方法二\n",
    "# s.index.lexsort_depth == s.index.nlevels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "65DB246948F54D33AD898EE03C6F4194",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "44.选择二级索引为`1, 3`的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "id": "DA5943E1C5774D999FA32D3DDA7C7BAD",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A  1    0.726566\n",
       "   3    0.905605\n",
       "B  1    0.626741\n",
       "   3    0.241187\n",
       "C  1    0.840930\n",
       "   3    0.354690\n",
       "dtype: float64"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.loc[:, [1, 3]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "E3B271B10E514224A23D471B5B7C5F61",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "45.对`s`进行切片操作，取一级索引从头至`B`，二级索引从`2`开始到最后"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false,
    "id": "6B626EA066FA41098A837850832D0F66",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A  2    0.495760\n",
       "   3    0.905605\n",
       "B  2    0.121265\n",
       "   3    0.241187\n",
       "dtype: float64"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.loc[pd.IndexSlice[:'B', 2:]]\r\n",
    "# 方法二\r\n",
    "# s.loc[slice(None, 'B'), slice(2, None)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "63258D8A886649D899C95A837D72349C",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "46.计算每个一级索引的和（A, B, C每一个的和）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false,
    "id": "4942734127674CE39FBFE078DA51DF74",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    3.078180\n",
       "B    0.993314\n",
       "C    1.893810\n",
       "dtype: float64"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.sum(level=0)\n",
    "#方法二\n",
    "#s.unstack().sum(axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3EAA26B0B98D4A078B457986919EC070",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "47.交换索引等级，新的Series是字典顺序吗？不是的话请排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false,
    "id": "BA78AE9AB69240AC8B3C9E143C41A5DC",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  A    0.950249\n",
      "1  A    0.726566\n",
      "2  A    0.495760\n",
      "3  A    0.905605\n",
      "0  B    0.004121\n",
      "1  B    0.626741\n",
      "2  B    0.121265\n",
      "3  B    0.241187\n",
      "0  C    0.595867\n",
      "1  C    0.840930\n",
      "2  C    0.102324\n",
      "3  C    0.354690\n",
      "dtype: float64\n",
      "False\n",
      "0  A    0.950249\n",
      "   B    0.004121\n",
      "   C    0.595867\n",
      "1  A    0.726566\n",
      "   B    0.626741\n",
      "   C    0.840930\n",
      "2  A    0.495760\n",
      "   B    0.121265\n",
      "   C    0.102324\n",
      "3  A    0.905605\n",
      "   B    0.241187\n",
      "   C    0.354690\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "new_s = s.swaplevel(0, 1)\n",
    "print(new_s)\n",
    "print(new_s.index.is_lexsorted())\n",
    "new_s = new_s.sort_index()\n",
    "print(new_s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5947FCF045F643D58DCF2330FEFFECE2",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false,
    "id": "E257843110B542A08DD732237CEB62EF",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "df = pd.DataFrame({\"xs\":[1,5,2,8,1], \"ys\":[4,2,1,9,6]})\n",
    "plt.style.use('ggplot')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ABA878EB9825499883EAB997A8B0F10A",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "48.画出`df`的散点图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false,
    "id": "EE673BF23AAA4CAE8506223454716FAA",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f3d38ea12b0>"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEJCAYAAAB11IfBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAEq5JREFUeJzt3W+MrGd53/HvoPFm7EAyS4Yo3kR1/lglEZQQuURpbAgUhiaaGgiBS8humwSmW1FOlROiuCKFZqoQVan6BmELejoNJC8MvYrgRXICdIEiEjBQuQQUQhwCtZR0U+NNZuS4MGyXPn2xc44We8/ZP2efmXl8fz/SyjOzz8z188rnd27fO888raqqkCQ9sT1p2QEkSfWz7CWpAJa9JBXAspekAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFaC87wAGeyitJp9M66oBVKnu2t7dP/dxer8fOzs4ZpqlPk7JCs/KatT5NyltS1o2NjWMd5zaOJBXAspekAlj2klQAy16SCmDZS1IBan03TkSsA+8DrgM+kJm/Vuc8SWqKyWRCt9sFoKoqptMp6+vrtc2re2V/B/D5zLwVuDUivq/meZK08iaTCYPBgNFoRFVVjEYjBoMBk8mktpmL2MZ5SkS02H/T/7MXME+SVlq326Xf7zMej+l0OozHY/r9/uWVfh1adV6DNiK6wG8De+xvGb07M+898P1NYBMgM2/Z3d099ax2u83e3t61BV6QJmWFZuU1a32alLcJWauqotPpXL4/m81otY48EfZx1tbWYEXOoH1NZj4cEf8F+MrBb2TmBeDC/G51LWeRlXTG3KI1Ka9Z69OkvKue9dLWzUHnzp1jNBqduPBX5Qza5wFvj4hvAX4Y+GTN8yRp5U2nU7a2thgOh8xmM4bDIVtbW0yn09pm1r2yfz/wz4DfB96cmY/WPE+SVt76+joXL16k2+3SarUYjUacP3++1nfj1Fr2mfl/gUGdMySpiQ4We6vVqrXowZOqJKkIlr0kFcCyl6QCWPaSVADLXpIKYNlLUgEse0kqgGUvSQWw7CWpAJa9JBXAspekAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFsOwlqQC1XqkqIr4VuBfoAR/PzLvqnCdJOlzdK/s7gU9m5q3AMyLih2qeJ0k6RN1l/3XghohoAR1gt+Z5kqRDtKqqqu3FI+I64D7gycCHM/N1j/n+JrAJkJm37O6e/u+CdrvN3t7eNaRdnCZlhWblNWt9mpS3pKxra2sAraOOq7vs/zWwnZnjiHgX8NbM/MQVDq+2t7dPPavX67Gzs3Pq5y9Sk7JCs/KatT5NyltS1o2NDThG2de9jfMUYDa//XX2V/iSpAWru+zvAV4bEfcB1wMfrnmeJOkQtb71MjMfBG6tc4Yk6WieVCVJBbDsJakAlr0kFcCyl6QCWPaSVADLXpIKYNlLUgEse0kqgGUvSQWw7CWpAJa9JBXAspekAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFqPVKVRHxfODN87s3AW/MzN+qc6Yk6fHqvizhR4HbACLiIvCZOudJkg63kG2ciLgBuDkzP7eIeZKkb1bryv6APvDhxz4YEZvAJkBm0uv1Tj2g3W5f0/MXqUlZoVl5zVqfJuU16yFzap+w73bgvY99MDMvABfmd6udnZ1TD+j1elzL8xepSVmhWXnNWp8m5S0p68bGxrGOq30bJyJawAuAj9Q9S5J0uEXs2T8H+HxmzhYwS5J0iNq3cTLz08BL6p4jSboyT6qSpAJY9pJUAMtekgpg2UtSASx7SSqAZS9JBbDsJakAlr0kFcCyl6QCWPaSVADLXpIKYNlLUgEse0kqgGUvSQWw7CWpAJa9JBWg9ouXRMRd7F+D9lHgpZm5e5avP5lM6Ha7AFRVxXQ6ZX19/SxHSFLj1bqyj4jvB56Rmc8F3g98z1m+/mQyYTAYMBqNqKqK0WjEYDBgMpmc5RhJary6t3FeCKxHxMeA5wL/8yxfvNvt0u/3GY/HdDodxuMx/X7/8kpfkrSvVVVVbS8eEb8C/EBmviYi7gPuyszfP/D9TWATIDNv2d09+Q5PVVV0Op3L92ezGa1W65qz16ndbrO3t7fsGMfWpLxmrU+T8paUdW1tDeDI0qt7z/4R4IH57S8D333wm5l5Abgwv1vt7Oyc6MUvbd0cdO7cOUaj0UoXfq/X46T/rsvUpLxmrU+T8paUdWNj41jH1b2Ncz/wnPntm9kv/DMznU7Z2tpiOBwym80YDodsbW0xnU7PcowkNV6t2zgAEfE24O8CX8jMf3KVQ6vt7e0Tv/6ld+M87WlP4+GHH27Eu3GatOqAZuU1a32alLekrPOV/dK3ccjM19b5+geLvdVqrXzRS9IyeFKVJBXAspekAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFsOwlqQCWvSQVwLKXpAJY9pJUAMtekgpg2UtSASx7SSqAZS9JBbDsJakApyr7iGhHxHeedRhJUj2OfaWqiPinwE8BdwKfAW6MiLdm5huv8pyfBMbAg/OHXpOZD1zpeElSPU5yWcJ/A/wIMAD+K/BG4E/n/7yat2Xmr58uniTpLJyk7FvA14AXA+8BvsExLnIL/ExEvBT4c+AVmVnvFc4lSY9zkrK/B3gIeAD4F8DHgP90xHO+BLwpMy9GxCeAnwA+eumbEbEJbAJkJr1e7wRxvlm73b6m5y9Sk7JCs/KatT5NymvWQ+ac4NgvAN8HPJSZVUT8o8z84hHP+WvgQ/PbDwLf9EvdzLwAXJjfrXZ2dk4Q55v1ej2u5fmL1KSs0Ky8Zq1Pk/KWlHVjY+NYx53k3Th3An8IvDsiXgH8xTGe83rgVRHxJOCZwB+dYJ4k6Ywcu+wz8+XATcA7gRcCn4mIjIhXRsR1V3ja3cDPA58C3peZf3yNeSVJp3CSbRyAXeD/ADPgOuBG4B8ArwOe/9iDM/MvD3tckrRYx17ZR8Q7gG3gV4EvArdl5nOBfw48q554kqSzcJKV/SeAuzLz4YMPZuYu8NQzTSVJOlPHLvvM/I91BpEk1ccPQpOkAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFsOwlqQCWvSQVwLKXpAJY9pJUAMtekgpg2UtSASx7SSqAZS9JBVhI2UfEL0bEh44+8uQmkwlVVQFQVRWTyaSOMZLUaLWXfUTcBPxcHa89mUwYDAaMRiOqqmI0GjEYDCx8SXqMRazs3wK8oY4X7na79Pt9xuMxnU6H8XhMv9+n2+3WMU6SGqt1aQukDhFxB/B04B3AODNf9JjvbwKbAJl5y+7u7olnVFVFp9O5fH82m9Fqta4ldu3a7TZ7e3vLjnFsTcpr1vo0KW9JWdfW1gCOLL26y/5e4G+xf/nDpwNvysy7r3B4tb29faLXv7R1Mx6PLz82HA4ZjUYrXfi9Xo+dnZ1lxzi2JuU1a32alLekrBsbG3CMsq91Gycz78jM24BXAfdfpehPZTqdsrW1xXA4ZDabMRwO2draYjqdnuUYSWq8Y19wfBWtr69z8eJFut0urVaL0WjE+fPnWV9fX3Y0SVopCyn7zHwQeNFRx53GwWJvtVoWvSQdwpOqJKkAlr0kFcCyl6QCWPaSVADLXpIKYNlLUgEse0kqgGUvSQWw7CWpAJa9JBXAspekAlj2klQAy16SCmDZS1IBLHtJKoBlL0kFqPXiJRHRBt4FbAAPZOar65wnSTpc3Sv7lwGfzcxbgRsj4tk1z5MkHaLuyxJ+APi9+Qq/CzxS8zxJ0iFaVVXVPiQiPgX8ZWa+7DGPbwKbAJl5y+7u7qlntNtt9vb2rinnojQpKzQrr1nr06S8JWVdW1sDaB11XK1lHxHfATwK7AEfAUaZ+d+ucHi1vb196lm9Xo+dnZ1TP3+RmpQVmpXXrPVpUt6Ssm5sbMAxyr7uPftfAl6Zmd8AvgpcX/M8SdIh6i77e4BXR8R9wF8BH6x5niTpELX+gjYz/xfw9+ucIUk6midVSVIBLHtJKoBlL0kFsOwlqQCWvSQVwLKXpAJY9pJUAMtekgpg2UtSASx7SSqAZS9JBbDsJakAlr0kFcCyl6QCWPaSVADLXpIKYNlLUgFqvVJVRLSAdwJPB74CvDwzm3HJd6kmk8mEbrcLQFVVTKdT1tfXl5xKT3R1r+xvBdqZ+WPAtwEvrnmetNImkwmDwYDRaERVVYxGIwaDAZPJZNnR9ARXd9k/BLxlfnu35lnSyut2u/T7fcbjMZ1Oh/F4TL/fv7zSl+rSqqqq9iER8dPALwAvzMxvHHh8E9gEyMxbdndP//dBu91mb68ZO0RNygrNytuErFVV0el0Lt+fzWa0Wq0lJjqeJvxsLykp69raGsCR/wHVXvYR8RLg9cDtmfk3Vzm02t7ePvWcXq/Hzs7OqZ+/SE3KCs3Ku+pZL23djMfjy48Nh0NGo9HKF/6q/2wPKinrxsYGHKPsa93GiYjvAn4ZGBxR9FIRptMpW1tbDIdDZrMZw+GQra0tptPpsqPpCa7Wd+MAPwvcCHwwIgB+MzN/s+aZ0spaX1/n4sWLdLtdWq0Wo9GI8+fP+24c1a7Wss/M3wB+o84ZUtMcLPZWq2XRayE8qUqSCmDZS1IBLHtJKoBlL0kFsOwlqQCWvSQVwLKXpAJY9pJUAMtekgpg2UtSASx7SSqAZS9JBbDsJakAlr0kFcCyl6QCWPaSVADLXpIKUHvZR8R1EfE7dc9pgslkwqULvFdVxWQyWXIiSaWo+4Lj1wP3A/065zTBZDJhMBgwGo2oqorRaMRgMLDwJS1ErWWfmV/LzGcBf1HnnCbodrv0+33G4zGdTofxeEy/36fb7S47mqQCtC5tK9QpIv4sM28+5PFNYBMgM2/Z3d099Yx2u83e3t7pQy5AVVV0Op3L92ezGa1Wa4mJjqcJP9tLzFqfJuUtKeva2hrAkUXSPvWEM5CZF4AL87vVzs7OqV+r1+txLc+v26Wtm4POnTvHaDRa+cJf9Z/tQWatT5PylpR1Y2PjWMf5bpwFmU6nbG1tMRwOmc1mDIdDtra2mE6ny44mqQBLXdmXZH19nYsXL9Ltdmm1WoxGI86fP8/6+vqyo0kqwELK/rD9+hIdLPZWq2XRS1oYt3EkqQCWvSQVwLKXpAJY9pJUAMtekgqwkDNoj2llgkhSwxx5ZuYqrexb1/IVEfdf62ss6qtJWZuW16zmLTTrkVap7CVJNbHsJakAT6Syv3D0ISujSVmhWXnNWp8m5TXrY6zSL2glSTV5Iq3sJUlX8IT41MuIuA54b2bevuwsVxMRLeCdwNOBrwAvz8yVvMJCRLSBdwEbwAOZ+eolRzqWiPhFYJCZL1p2liuJiJ8ExsCD84dek5kPLC/R0SLiLuB24FHgpZl5+isN1Sging+8eX73JuCNmflby0t0ZRHxrcC9QA/4eGbeVee8xq/sG3ad21uBdmb+GPBtwIuXnOdqXgZ8NjNvBW6MiGcvO9BRIuIm4OeWneOY3paZt82/Vr3ovx94RmY+F3g/8D1LjnRFmfnRSz9X4HPAZ5ad6SruBD45/zP2jIj4oTqHNX5ln5lfA54VEX+27CzH8BDwlvntlVwZHfAB4PfmK/wu8MiS8xzHW4A3AK9fdpBj+JmIeCnw58ArMnOVf3n2QmA9Ij7G/n/Db11yniNFxA3AzZn5uWVnuYqvAzfM/4+/Q82d0PiVfZNk5hcz89MR8dPAGvDBZWe6ksx8NDO/CnwceCgzv7zsTFcTEXcAnwX+eNlZjuFLwJsy80eBG4GfWHKeozwNeDgzn8f+qv62Jec5jj7w4WWHOMK9wE8BXwD+JDO/VOcwy37BIuIlwC8At2fmN5ad50oi4jsi4luAH2d/VfeCZWc6wj9kfwX6buCWiDi35DxX89fAh+a3HwS+c3lRjuUR4NJW05eB715iluO6HfjdZYc4whuAt2fmDwJPjYgfr3OYZb9AEfFdwC+z/wvEv1l2niP8EvDK+V9IXwWuX3Keq8rMO+b7tK8C7s/Mu5ed6SpeD7wqIp4EPBP4oyXnOcr9wHPmt29mv/BX1nxb5AXAR5ad5QhPAWbz218HnlznMMt+sX6W/f9t/2BE/EFErPI7XO4BXh0R9wF/xQpvOTXQ3cDPA58C3peZK731lJn3ATsR8d/Zf2fWp5ed6QjPAT6fmbMjj1yue4DXzv+MXU/N206eVCVJBXBlL0kFsOwlqQCWvSQVwLKXpAJY9pJUAMtekgpg2UtSARr/QWjSWYqI72X/84CeCXw78AfAs4DXzb8AfjUz/8NSAkqn5MpeOiAzHwTeDvwK+5+LPpp/618BPwg8m/0Pr5IaxZW99Hj/jv3Pg3kE+MdAC/hT4N+z/7ERdy4vmnQ6ruylx+vMv54MXJeZ/w/4UeA9wPOA/xERa0vMJ52YZS893r8F3gF8DPiXEfG357c/zv52zgbw1OXFk07ObRzpgIj4e8CLgL8D3MD+pe3+M/sfl3vp4hJ3Z+b/Xk5C6XT81EtJKoDbOJJUAMtekgpg2UtSASx7SSqAZS9JBbDsJakAlr0kFcCyl6QC/H8O7PUC8L54xAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot.scatter(\"xs\", \"ys\", color = \"black\", marker = \"x\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3571FCD0673346158D19B701FF540CD4",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "49.可视化指定4维DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false,
    "id": "763CECD47B954A6F804898FBAFFE9BC2",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f3d36b774a8>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"productivity\":[5,2,3,1,4,5,6,7,8,3,4,8,9],\r\n",
    "                   \"hours_in\"    :[1,9,6,5,3,9,2,9,1,7,4,2,2],\r\n",
    "                   \"happiness\"   :[2,1,3,2,3,1,2,3,1,2,2,1,3],\r\n",
    "                   \"caffienated\" :[0,0,1,1,0,0,0,0,1,1,0,1,0]})\r\n",
    "\r\n",
    "df.plot.scatter(\"hours_in\", \"productivity\", s = df.happiness * 100, c = df.caffienated)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "3A18A9AE34D8418A863948333844BB7D",
    "jupyter": {},
    "mdEditEnable": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "50.在同一个图中可视化2组数据，共用X轴，但y轴不同"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false,
    "id": "9089C025DDC44A74836D5A1ADB6AD5EC",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"revenue\":[57,68,63,71,72,90,80,62,59,51,47,52],\r\n",
    "                   \"advertising\":[2.1,1.9,2.7,3.0,3.6,3.2,2.7,2.4,1.8,1.6,1.3,1.9],\r\n",
    "                   \"month\":range(12)})\r\n",
    "\r\n",
    "ax = df.plot.bar(\"month\", \"revenue\", color = \"green\")\r\n",
    "df.plot.line(\"month\", \"advertising\", secondary_y = True, ax = ax)\r\n",
    "ax.set_xlim((-1,12));"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
