{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# QuantLab: pandas\n", "### [(Go to Quant Lab)](https://israeldi.github.io/quantlab/)\n", "\n", "#### Source: Python for Finance (2nd ed.)\n", "\n", "**Mastering Data-Driven Finance**\n", "\n", "© Dr. Yves J. Hilpisch | The Python Quants GmbH\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pandas Basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### First Steps with DataFrame Class" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "uuid": "eda2a742-134d-4d47-8b30-557b846b9bb3" }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a dataframe by passing data, column names, and row names as arguments" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbers
a10
b20
c30
d40
\n", "
" ], "text/plain": [ " numbers\n", "a 10\n", "b 20\n", "c 30\n", "d 40" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame([10, 20, 30, 40], \n", " columns=['numbers'], \n", " index=['a', 'b', 'c', 'd']) \n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Access the row names of a dataframe:**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "uuid": "47b70a7b-710f-4c40-9a70-b09db7af1a12" }, "outputs": [ { "data": { "text/plain": [ "Index(['a', 'b', 'c', 'd'], dtype='object')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Access the column names**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "uuid": "a36c6695-520d-4df1-a6fa-5f8362af37a3" }, "outputs": [ { "data": { "text/plain": [ "Index(['numbers'], dtype='object')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Access a row by its name**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "uuid": "c93aed37-21de-429d-86ed-9849e4c3e23c" }, "outputs": [ { "data": { "text/plain": [ "numbers 30\n", "Name: c, dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Or access multiple rows**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "uuid": "8c7c2f69-3673-40d9-a568-0471c629810d" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbers
a10
d40
\n", "
" ], "text/plain": [ " numbers\n", "a 10\n", "d 40" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Access rows by index number rather than its name**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "uuid": "c3ce0cc3-26e8-4256-ab8c-9a2d4b181633" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbers
b20
c30
\n", "
" ], "text/plain": [ " numbers\n", "b 20\n", "c 30" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Take sums along each column**" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "uuid": "94b1d846-63df-49f4-8a7f-8fed03e5f4fa" }, "outputs": [ { "data": { "text/plain": [ "numbers 100\n", "dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Apply a specific operation to each column**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "uuid": "4e73eb4f-352d-4527-b0c5-4f3a6e7eb354" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbers
a100
b400
c900
d1600
\n", "
" ], "text/plain": [ " numbers\n", "a 100\n", "b 400\n", "c 900\n", "d 1600" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Another way of doing this operation**" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "uuid": "75206a83-0154-4be2-88d0-7a82a190fda1" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbers
a100
b400
c900
d1600
\n", "
" ], "text/plain": [ " numbers\n", "a 100\n", "b 400\n", "c 900\n", "d 1600" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Generate a new column called `floats`**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
numbersfloats
a101.5
b202.5
c303.5
d404.5
\n", "
" ], "text/plain": [ " numbers floats\n", "a 10 1.5\n", "b 20 2.5\n", "c 30 3.5\n", "d 40 4.5" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Access the floats column**" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "uuid": "c49b9aea-417a-4c2b-8e27-0e8771a77c87" }, "outputs": [ { "data": { "text/plain": [ "a 1.5\n", "b 2.5\n", "c 3.5\n", "d 4.5\n", "Name: floats, dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Initialize a new column with names `Yves, Sandra, Lilli, Henry` at indices `d, a, b, c`**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
floatsnamesnumbers
a1.50Sandra10
b2.50Lilli20
c3.50Henry30
d4.50Yves40
y5.75NaN100
\n", "
" ], "text/plain": [ " floats names numbers\n", "a 1.50 Sandra 10\n", "b 2.50 Lilli 20\n", "c 3.50 Henry 30\n", "d 4.50 Yves 40\n", "y 5.75 NaN 100" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add a new row with entries `[100, 5.75, 'Jil']` while ignoring the index**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "uuid": "584ac18c-161f-4c7b-8ff1-1cd406fb8437" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
floatsnamesnumbers
01.50Sandra10
12.50Lilli20
23.50Henry30
34.50Yves40
45.75NaN100
55.75Jil100
\n", "
" ], "text/plain": [ " floats names numbers\n", "0 1.50 Sandra 10\n", "1 2.50 Lilli 20\n", "2 3.50 Henry 30\n", "3 4.50 Yves 40\n", "4 5.75 NaN 100\n", "5 5.75 Jil 100" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add a new row with entries `[100, 5.75, 'Jil']` at index `y`**" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/israeldiego/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py:6201: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", "of pandas will change to not sort by default.\n", "\n", "To accept the future behavior, pass 'sort=True'.\n", "\n", "To retain the current behavior and silence the warning, pass sort=False\n", "\n", " sort=sort)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
floatsnamesnumbers
a1.50Sandra10
b2.50Lilli20
c3.50Henry30
d4.50Yves40
y5.75NaN100
y5.75Jil100
\n", "
" ], "text/plain": [ " floats names numbers\n", "a 1.50 Sandra 10\n", "b 2.50 Lilli 20\n", "c 3.50 Henry 30\n", "d 4.50 Yves 40\n", "y 5.75 NaN 100\n", "y 5.75 Jil 100" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add a new row with name `Liz` at index `z`**" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Check the data types for each column**" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numbers float64\n", "floats float64\n", "names object\n", "dtype: object" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get the Averages for columns: `numbers` and `floats`**" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "uuid": "3e863c7f-7875-4911-997b-6e48123dc1e5" }, "outputs": [ { "data": { "text/plain": [ "numbers 40.00\n", "floats 3.55\n", "dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get the standard deviation for columns: `numbers` and `floats`**" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "uuid": "c52173a0-485d-4eb2-b6b4-407d1ff2c30e" }, "outputs": [ { "data": { "text/plain": [ "numbers 35.355339\n", "floats 1.662077\n", "dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Second Steps with DataFrame Class" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "np.random.seed(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Generate `9x4` array of random numbers from $N(0,1)$ distribution**" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1.74976547, 0.3426804 , 1.1530358 , -0.25243604],\n", " [ 0.98132079, 0.51421884, 0.22117967, -1.07004333],\n", " [-0.18949583, 0.25500144, -0.45802699, 0.43516349],\n", " [-0.58359505, 0.81684707, 0.67272081, -0.10441114],\n", " [-0.53128038, 1.02973269, -0.43813562, -1.11831825],\n", " [ 1.61898166, 1.54160517, -0.25187914, -0.84243574],\n", " [ 0.18451869, 0.9370822 , 0.73100034, 1.36155613],\n", " [-0.32623806, 0.05567601, 0.22239961, -1.443217 ],\n", " [-0.75635231, 0.81645401, 0.75044476, -0.45594693]])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Convert the previous numpy array to a dataframe**" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
0-1.7497650.3426801.153036-0.252436
10.9813210.5142190.221180-1.070043
2-0.1894960.255001-0.4580270.435163
3-0.5835950.8168470.672721-0.104411
4-0.5312801.029733-0.438136-1.118318
51.6189821.541605-0.251879-0.842436
60.1845190.9370820.7310001.361556
7-0.3262380.0556760.222400-1.443217
8-0.7563520.8164540.750445-0.455947
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 -1.749765 0.342680 1.153036 -0.252436\n", "1 0.981321 0.514219 0.221180 -1.070043\n", "2 -0.189496 0.255001 -0.458027 0.435163\n", "3 -0.583595 0.816847 0.672721 -0.104411\n", "4 -0.531280 1.029733 -0.438136 -1.118318\n", "5 1.618982 1.541605 -0.251879 -0.842436\n", "6 0.184519 0.937082 0.731000 1.361556\n", "7 -0.326238 0.055676 0.222400 -1.443217\n", "8 -0.756352 0.816454 0.750445 -0.455947" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Change column names to `['No1', 'No2', 'No3', 'No4']`**" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
0-1.7497650.3426801.153036-0.252436
10.9813210.5142190.221180-1.070043
2-0.1894960.255001-0.4580270.435163
3-0.5835950.8168470.672721-0.104411
4-0.5312801.029733-0.438136-1.118318
51.6189821.541605-0.251879-0.842436
60.1845190.9370820.7310001.361556
7-0.3262380.0556760.222400-1.443217
8-0.7563520.8164540.750445-0.455947
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "0 -1.749765 0.342680 1.153036 -0.252436\n", "1 0.981321 0.514219 0.221180 -1.070043\n", "2 -0.189496 0.255001 -0.458027 0.435163\n", "3 -0.583595 0.816847 0.672721 -0.104411\n", "4 -0.531280 1.029733 -0.438136 -1.118318\n", "5 1.618982 1.541605 -0.251879 -0.842436\n", "6 0.184519 0.937082 0.731000 1.361556\n", "7 -0.326238 0.055676 0.222400 -1.443217\n", "8 -0.756352 0.816454 0.750445 -0.455947" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get the mean of column `No2`**" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "uuid": "68e8d73f-93d3-47ac-a656-1edbdebcd1ff" }, "outputs": [ { "data": { "text/plain": [ "0.7010330941456459" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Generate dates for end of day-month for first 9 months of 2019**" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',\n", " '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',\n", " '2019-09-30'],\n", " dtype='datetime64[ns]', freq='M')" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": { "uuid": "a80e1e88-d211-4ee4-a6d3-90403a7739a8" }, "source": [ "**Make these dates the new row indices of our dataframe**" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
2019-01-31-1.7497650.3426801.153036-0.252436
2019-02-280.9813210.5142190.221180-1.070043
2019-03-31-0.1894960.255001-0.4580270.435163
2019-04-30-0.5835950.8168470.672721-0.104411
2019-05-31-0.5312801.029733-0.438136-1.118318
2019-06-301.6189821.541605-0.251879-0.842436
2019-07-310.1845190.9370820.7310001.361556
2019-08-31-0.3262380.0556760.222400-1.443217
2019-09-30-0.7563520.8164540.750445-0.455947
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "2019-01-31 -1.749765 0.342680 1.153036 -0.252436\n", "2019-02-28 0.981321 0.514219 0.221180 -1.070043\n", "2019-03-31 -0.189496 0.255001 -0.458027 0.435163\n", "2019-04-30 -0.583595 0.816847 0.672721 -0.104411\n", "2019-05-31 -0.531280 1.029733 -0.438136 -1.118318\n", "2019-06-30 1.618982 1.541605 -0.251879 -0.842436\n", "2019-07-31 0.184519 0.937082 0.731000 1.361556\n", "2019-08-31 -0.326238 0.055676 0.222400 -1.443217\n", "2019-09-30 -0.756352 0.816454 0.750445 -0.455947" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Extract only the data from our dataframe**" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4" }, "outputs": [ { "data": { "text/plain": [ "array([[-1.74976547, 0.3426804 , 1.1530358 , -0.25243604],\n", " [ 0.98132079, 0.51421884, 0.22117967, -1.07004333],\n", " [-0.18949583, 0.25500144, -0.45802699, 0.43516349],\n", " [-0.58359505, 0.81684707, 0.67272081, -0.10441114],\n", " [-0.53128038, 1.02973269, -0.43813562, -1.11831825],\n", " [ 1.61898166, 1.54160517, -0.25187914, -0.84243574],\n", " [ 0.18451869, 0.9370822 , 0.73100034, 1.36155613],\n", " [-0.32623806, 0.05567601, 0.22239961, -1.443217 ],\n", " [-0.75635231, 0.81645401, 0.75044476, -0.45594693]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Extract the data using numpy command**" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4" }, "outputs": [ { "data": { "text/plain": [ "array([[-1.74976547, 0.3426804 , 1.1530358 , -0.25243604],\n", " [ 0.98132079, 0.51421884, 0.22117967, -1.07004333],\n", " [-0.18949583, 0.25500144, -0.45802699, 0.43516349],\n", " [-0.58359505, 0.81684707, 0.67272081, -0.10441114],\n", " [-0.53128038, 1.02973269, -0.43813562, -1.11831825],\n", " [ 1.61898166, 1.54160517, -0.25187914, -0.84243574],\n", " [ 0.18451869, 0.9370822 , 0.73100034, 1.36155613],\n", " [-0.32623806, 0.05567601, 0.22239961, -1.443217 ],\n", " [-0.75635231, 0.81645401, 0.75044476, -0.45594693]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Analytics" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "DatetimeIndex: 9 entries, 2019-01-31 to 2019-09-30\n", "Freq: M\n", "Data columns (total 4 columns):\n", "No1 9 non-null float64\n", "No2 9 non-null float64\n", "No3 9 non-null float64\n", "No4 9 non-null float64\n", "dtypes: float64(4)\n", "memory usage: 360.0 bytes\n" ] } ], "source": [ "df.info() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get descriptive statistics for data frame**" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "uuid": "125980cc-91ec-4ab4-9a4a-cfd772dd1254" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
count9.0000009.0000009.0000009.000000
mean-0.1502120.7010330.289193-0.387788
std0.9883060.4576850.5799200.877532
min-1.7497650.055676-0.458027-1.443217
25%-0.5835950.342680-0.251879-1.070043
50%-0.3262380.8164540.222400-0.455947
75%0.1845190.9370820.731000-0.104411
max1.6189821.5416051.1530361.361556
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "count 9.000000 9.000000 9.000000 9.000000\n", "mean -0.150212 0.701033 0.289193 -0.387788\n", "std 0.988306 0.457685 0.579920 0.877532\n", "min -1.749765 0.055676 -0.458027 -1.443217\n", "25% -0.583595 0.342680 -0.251879 -1.070043\n", "50% -0.326238 0.816454 0.222400 -0.455947\n", "75% 0.184519 0.937082 0.731000 -0.104411\n", "max 1.618982 1.541605 1.153036 1.361556" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get column sums**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "uuid": "f760ea25-c64c-4e70-9f91-b72701d919ce" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get column means**" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223" }, "outputs": [ { "data": { "text/plain": [ "No1 -0.150212\n", "No2 0.701033\n", "No3 0.289193\n", "No4 -0.387788\n", "dtype: float64" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get column means by specifying axis**" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223" }, "outputs": [ { "data": { "text/plain": [ "No1 -0.150212\n", "No2 0.701033\n", "No3 0.289193\n", "No4 -0.387788\n", "dtype: float64" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get row means by specifying axis**" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2019-01-31 -0.126621\n", "2019-02-28 0.161669\n", "2019-03-31 0.010661\n", "2019-04-30 0.200390\n", "2019-05-31 -0.264500\n", "2019-06-30 0.516568\n", "2019-07-31 0.803539\n", "2019-08-31 -0.372845\n", "2019-09-30 0.088650\n", "Freq: M, dtype: float64" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get column cumulative sum**" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "uuid": "8e167ea8-09b7-4585-8cac-28fe20eefe66" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
2019-01-31-1.7497650.3426801.153036-0.252436
2019-02-28-0.7684450.8568991.374215-1.322479
2019-03-31-0.9579411.1119010.916188-0.887316
2019-04-30-1.5415361.9287481.588909-0.991727
2019-05-31-2.0728162.9584801.150774-2.110045
2019-06-30-0.4538344.5000860.898895-2.952481
2019-07-31-0.2693165.4371681.629895-1.590925
2019-08-31-0.5955545.4928441.852294-3.034142
2019-09-30-1.3519066.3092982.602739-3.490089
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "2019-01-31 -1.749765 0.342680 1.153036 -0.252436\n", "2019-02-28 -0.768445 0.856899 1.374215 -1.322479\n", "2019-03-31 -0.957941 1.111901 0.916188 -0.887316\n", "2019-04-30 -1.541536 1.928748 1.588909 -0.991727\n", "2019-05-31 -2.072816 2.958480 1.150774 -2.110045\n", "2019-06-30 -0.453834 4.500086 0.898895 -2.952481\n", "2019-07-31 -0.269316 5.437168 1.629895 -1.590925\n", "2019-08-31 -0.595554 5.492844 1.852294 -3.034142\n", "2019-09-30 -1.351906 6.309298 2.602739 -3.490089" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Take log of each entry**" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/yves/miniconda3/envs/py4fi2nd/lib/python3.6/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in log\n", " \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
2019-01-31NaN-1.0709570.142398NaN
2019-02-28-0.018856-0.665106-1.508780NaN
2019-03-31NaN-1.366486NaN-0.832033
2019-04-30NaN-0.202303-0.396425NaN
2019-05-31NaN0.029299NaNNaN
2019-06-300.4817970.432824NaNNaN
2019-07-31-1.690005-0.064984-0.3133410.308628
2019-08-31NaN-2.888206-1.503279NaN
2019-09-30NaN-0.202785-0.287089NaN
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "2019-01-31 NaN -1.070957 0.142398 NaN\n", "2019-02-28 -0.018856 -0.665106 -1.508780 NaN\n", "2019-03-31 NaN -1.366486 NaN -0.832033\n", "2019-04-30 NaN -0.202303 -0.396425 NaN\n", "2019-05-31 NaN 0.029299 NaN NaN\n", "2019-06-30 0.481797 0.432824 NaN NaN\n", "2019-07-31 -1.690005 -0.064984 -0.313341 0.308628\n", "2019-08-31 NaN -2.888206 -1.503279 NaN\n", "2019-09-30 NaN -0.202785 -0.287089 NaN" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# raises warning\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Take square root of each entry**" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "uuid": "9dfc1e40-c030-4a9c-9e3a-ff28c64a93df" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
2019-01-311.3227870.5853891.0737950.502430
2019-02-280.9906160.7170910.4702971.034429
2019-03-310.4353110.5049770.6767770.659669
2019-04-300.7639340.9037960.8201960.323127
2019-05-310.7288901.0147570.6619181.057506
2019-06-301.2723921.2416140.5018760.917843
2019-07-310.4295560.9680300.8549861.166857
2019-08-310.5711730.2359580.4715931.201340
2019-09-300.8696850.9035780.8662820.675238
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "2019-01-31 1.322787 0.585389 1.073795 0.502430\n", "2019-02-28 0.990616 0.717091 0.470297 1.034429\n", "2019-03-31 0.435311 0.504977 0.676777 0.659669\n", "2019-04-30 0.763934 0.903796 0.820196 0.323127\n", "2019-05-31 0.728890 1.014757 0.661918 1.057506\n", "2019-06-30 1.272392 1.241614 0.501876 0.917843\n", "2019-07-31 0.429556 0.968030 0.854986 1.166857\n", "2019-08-31 0.571173 0.235958 0.471593 1.201340\n", "2019-09-30 0.869685 0.903578 0.866282 0.675238" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Visualization" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "from pylab import plt, mpl \n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Plot the cumulative sum of each column from our df**" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Plot Bar chart for each date**" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GroupBy Operations" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "scrolled": true, "uuid": "4bc106dd-9590-4566-bc70-d410517c8223" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4Quarter
2019-01-31-1.7497650.3426801.153036-0.252436Q1
2019-02-280.9813210.5142190.221180-1.070043Q1
2019-03-31-0.1894960.255001-0.4580270.435163Q1
2019-04-30-0.5835950.8168470.672721-0.104411Q2
2019-05-31-0.5312801.029733-0.438136-1.118318Q2
2019-06-301.6189821.541605-0.251879-0.842436Q2
2019-07-310.1845190.9370820.7310001.361556Q3
2019-08-31-0.3262380.0556760.222400-1.443217Q3
2019-09-30-0.7563520.8164540.750445-0.455947Q3
\n", "
" ], "text/plain": [ " No1 No2 No3 No4 Quarter\n", "2019-01-31 -1.749765 0.342680 1.153036 -0.252436 Q1\n", "2019-02-28 0.981321 0.514219 0.221180 -1.070043 Q1\n", "2019-03-31 -0.189496 0.255001 -0.458027 0.435163 Q1\n", "2019-04-30 -0.583595 0.816847 0.672721 -0.104411 Q2\n", "2019-05-31 -0.531280 1.029733 -0.438136 -1.118318 Q2\n", "2019-06-30 1.618982 1.541605 -0.251879 -0.842436 Q2\n", "2019-07-31 0.184519 0.937082 0.731000 1.361556 Q3\n", "2019-08-31 -0.326238 0.055676 0.222400 -1.443217 Q3\n", "2019-09-30 -0.756352 0.816454 0.750445 -0.455947 Q3" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Quarter'] = ['Q1', 'Q1', 'Q1', 'Q2', 'Q2',\n", " 'Q2', 'Q3', 'Q3', 'Q3']\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Group by quarter**" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get count for each group**" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "uuid": "a871b95e-5946-4b09-b8dc-bc9503d2ff14" }, "outputs": [ { "data": { "text/plain": [ "Quarter\n", "Q1 3\n", "Q2 3\n", "Q3 3\n", "dtype: int64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get mean of each group**" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "uuid": "804e567f-6b74-4405-a10e-d19d914655e7" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
Quarter
Q1-0.3193140.3706340.305396-0.295772
Q20.1680351.129395-0.005765-0.688388
Q3-0.2993570.6030710.567948-0.179203
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "Quarter \n", "Q1 -0.319314 0.370634 0.305396 -0.295772\n", "Q2 0.168035 1.129395 -0.005765 -0.688388\n", "Q3 -0.299357 0.603071 0.567948 -0.179203" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get maximum of each group**" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "uuid": "7eb45e5c-b86f-4464-afd9-d5a3665e0f8e" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
Quarter
Q10.9813210.5142191.1530360.435163
Q21.6189821.5416050.672721-0.104411
Q30.1845190.9370820.7504451.361556
\n", "
" ], "text/plain": [ " No1 No2 No3 No4\n", "Quarter \n", "Q1 0.981321 0.514219 1.153036 0.435163\n", "Q2 1.618982 1.541605 0.672721 -0.104411\n", "Q3 0.184519 0.937082 0.750445 1.361556" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Get minimum and maximum of each group**" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No2No3No4
minmaxminmaxminmaxminmax
Quarter
Q1-1.750.980.260.51-0.461.15-1.070.44
Q2-0.581.620.821.54-0.440.67-1.12-0.10
Q3-0.760.180.060.940.220.75-1.441.36
\n", "
" ], "text/plain": [ " No1 No2 No3 No4 \n", " min max min max min max min max\n", "Quarter \n", "Q1 -1.75 0.98 0.26 0.51 -0.46 1.15 -1.07 0.44\n", "Q2 -0.58 1.62 0.82 1.54 -0.44 0.67 -1.12 -0.10\n", "Q3 -0.76 0.18 0.06 0.94 0.22 0.75 -1.44 1.36" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we add another column to group" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "uuid": "542cf99a-bbf8-447e-9643-d6887ac74be7" }, "outputs": [], "source": [ "df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even',\n", " 'Odd', 'Even', 'Odd']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Group by Quarter followed by Odd_Even**" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "uuid": "f5144c9f-ff37-4e35-9417-e39debdcd45b" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 72, "metadata": { "uuid": "06904508-dbf1-431f-a3a2-681f29f03c51" }, "outputs": [ { "data": { "text/plain": [ "Quarter Odd_Even\n", "Q1 Even 1\n", " Odd 2\n", "Q2 Even 2\n", " Odd 1\n", "Q3 Even 1\n", " Odd 2\n", "dtype: int64" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 73, "metadata": { "uuid": "b8471956-40fc-4203-a54a-aaa45f5a3c00" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
No1No4
summeansummean
QuarterOdd_Even
Q1Even0.9813210.981321-1.070043-1.070043
Odd-1.939261-0.9696310.1827270.091364
Q2Even1.0353870.517693-0.946847-0.473423
Odd-0.531280-0.531280-1.118318-1.118318
Q3Even-0.326238-0.326238-1.443217-1.443217
Odd-0.571834-0.2859170.9056090.452805
\n", "
" ], "text/plain": [ " No1 No4 \n", " sum mean sum mean\n", "Quarter Odd_Even \n", "Q1 Even 0.981321 0.981321 -1.070043 -1.070043\n", " Odd -1.939261 -0.969631 0.182727 0.091364\n", "Q2 Even 1.035387 0.517693 -0.946847 -0.473423\n", " Odd -0.531280 -0.531280 -1.118318 -1.118318\n", "Q3 Even -0.326238 -0.326238 -1.443217 -1.443217\n", " Odd -0.571834 -0.285917 0.905609 0.452805" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "groups[['No1', 'No4']].aggregate([sum, np.mean])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Complex Selection" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "data = np.random.standard_normal((10, 2)) " ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(data, columns=['x', 'y']) " ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 10 entries, 0 to 9\n", "Data columns (total 2 columns):\n", "x 10 non-null float64\n", "y 10 non-null float64\n", "dtypes: float64(2)\n", "memory usage: 240.0 bytes\n" ] } ], "source": [ "df.info() " ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xy
01.189622-1.690617
1-1.356399-1.232435
2-0.544439-0.668172
30.007315-0.612939
41.299748-1.733096
\n", "
" ], "text/plain": [ " x y\n", "0 1.189622 -1.690617\n", "1 -1.356399 -1.232435\n", "2 -0.544439 -0.668172\n", "3 0.007315 -0.612939\n", "4 1.299748 -1.733096" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head() " ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xy
5-0.9833100.357508
6-1.6135791.470714
7-1.188018-0.549746
8-0.940046-0.827932
90.1088630.507810
\n", "
" ], "text/plain": [ " x y\n", "5 -0.983310 0.357508\n", "6 -1.613579 1.470714\n", "7 -1.188018 -0.549746\n", "8 -0.940046 -0.827932\n", "9 0.108863 0.507810" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Filter rows where `x`>0 and `y` < 0**" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xy
01.189622-1.690617
30.007315-0.612939
41.299748-1.733096
\n", "
" ], "text/plain": [ " x y\n", "0 1.189622 -1.690617\n", "3 0.007315 -0.612939\n", "4 1.299748 -1.733096" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concatenation, Joining and Merging" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create our first dataframe" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "df1 = pd.DataFrame(['100', '200', '300', '400'], \n", " index=['a', 'b', 'c', 'd'],\n", " columns=['A',])" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A
a100
b200
c300
d400
\n", "
" ], "text/plain": [ " A\n", "a 100\n", "b 200\n", "c 300\n", "d 400" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a second dataframe" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "df2 = pd.DataFrame(['200', '150', '50'], \n", " index=['f', 'b', 'd'],\n", " columns=['B',])" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
B
f200
b150
d50
\n", "
" ], "text/plain": [ " B\n", "f 200\n", "b 150\n", "d 50" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Concatenation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Concatenate the columns and indices of both dataframes" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200NaN
c300NaN
d400NaN
fNaN200
bNaN150
dNaN50
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 NaN\n", "c 300 NaN\n", "d 400 NaN\n", "f NaN 200\n", "b NaN 150\n", "d NaN 50" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.append(df2, sort=False) " ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0100NaN
1200NaN
2300NaN
3400NaN
4NaN200
5NaN150
6NaN50
\n", "
" ], "text/plain": [ " A B\n", "0 100 NaN\n", "1 200 NaN\n", "2 300 NaN\n", "3 400 NaN\n", "4 NaN 200\n", "5 NaN 150\n", "6 NaN 50" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.append(df2, ignore_index=True, sort=False) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Can also achieve the same with concat method" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200NaN
c300NaN
d400NaN
fNaN200
bNaN150
dNaN50
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 NaN\n", "c 300 NaN\n", "d 400 NaN\n", "f NaN 200\n", "b NaN 150\n", "d NaN 50" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat((df1, df2), sort=False) " ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
0100NaN
1200NaN
2300NaN
3400NaN
4NaN200
5NaN150
6NaN50
\n", "
" ], "text/plain": [ " A B\n", "0 100 NaN\n", "1 200 NaN\n", "2 300 NaN\n", "3 400 NaN\n", "4 NaN 200\n", "5 NaN 150\n", "6 NaN 50" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat((df1, df2), ignore_index=True, sort=False) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Joining" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Join performs left join by default" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200150
c300NaN
d40050
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 150\n", "c 300 NaN\n", "d 400 50" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.join(df2) " ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BA
f200NaN
b150200
d50400
\n", "
" ], "text/plain": [ " B A\n", "f 200 NaN\n", "b 150 200\n", "d 50 400" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.join(df1) " ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200150
c300NaN
d40050
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 150\n", "c 300 NaN\n", "d 400 50" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.join(df2, how='left') " ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
fNaN200
b200150
d40050
\n", "
" ], "text/plain": [ " A B\n", "f NaN 200\n", "b 200 150\n", "d 400 50" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.join(df2, how='right') " ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
b200150
d40050
\n", "
" ], "text/plain": [ " A B\n", "b 200 150\n", "d 400 50" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.join(df2, how='inner') " ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200150
c300NaN
d40050
fNaN200
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 150\n", "c 300 NaN\n", "d 400 50\n", "f NaN 200" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.join(df2, how='outer') " ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame()" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "df['A'] = df1['A'] " ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A
a100
b200
c300
d400
\n", "
" ], "text/plain": [ " A\n", "a 100\n", "b 200\n", "c 300\n", "d 400" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "df['B'] = df2 " ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200150
c300NaN
d40050
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 150\n", "c 300 NaN\n", "d 400 50" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({'A': df1['A'], 'B': df2['B']}) " ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
a100NaN
b200150
c300NaN
d40050
fNaN200
\n", "
" ], "text/plain": [ " A B\n", "a 100 NaN\n", "b 200 150\n", "c 300 NaN\n", "d 400 50\n", "f NaN 200" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Merging" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [], "source": [ "c = pd.Series([250, 150, 50], index=['b', 'd', 'c'])\n", "df1['C'] = c\n", "df2['C'] = c" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC
a100NaN
b200250.0
c30050.0
d400150.0
\n", "
" ], "text/plain": [ " A C\n", "a 100 NaN\n", "b 200 250.0\n", "c 300 50.0\n", "d 400 150.0" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BC
f200NaN
b150250.0
d50150.0
\n", "
" ], "text/plain": [ " B C\n", "f 200 NaN\n", "b 150 250.0\n", "d 50 150.0" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
0100NaN200
1200250.0150
2400150.050
\n", "
" ], "text/plain": [ " A C B\n", "0 100 NaN 200\n", "1 200 250.0 150\n", "2 400 150.0 50" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2) " ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
0100NaN200
1200250.0150
2400150.050
\n", "
" ], "text/plain": [ " A C B\n", "0 100 NaN 200\n", "1 200 250.0 150\n", "2 400 150.0 50" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, on='C') " ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
0100NaN200
1200250.0150
230050.0NaN
3400150.050
\n", "
" ], "text/plain": [ " A C B\n", "0 100 NaN 200\n", "1 200 250.0 150\n", "2 300 50.0 NaN\n", "3 400 150.0 50" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, how='outer') " ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC_xBC_y
0200250.0200NaN
\n", "
" ], "text/plain": [ " A C_x B C_y\n", "0 200 250.0 200 NaN" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, left_on='A', right_on='B')" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC_xBC_y
0100NaNNaNNaN
1200250.0200NaN
230050.0NaNNaN
3400150.0NaNNaN
4NaNNaN150250.0
5NaNNaN50150.0
\n", "
" ], "text/plain": [ " A C_x B C_y\n", "0 100 NaN NaN NaN\n", "1 200 250.0 200 NaN\n", "2 300 50.0 NaN NaN\n", "3 400 150.0 NaN NaN\n", "4 NaN NaN 150 250.0\n", "5 NaN NaN 50 150.0" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, left_on='A', right_on='B', how='outer') " ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC_xBC_y
b200250.0150250.0
d400150.050150.0
\n", "
" ], "text/plain": [ " A C_x B C_y\n", "b 200 250.0 150 250.0\n", "d 400 150.0 50 150.0" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, left_index=True, right_index=True)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
f100NaN200
b200250.0150
d400150.050
\n", "
" ], "text/plain": [ " A C B\n", "f 100 NaN 200\n", "b 200 250.0 150\n", "d 400 150.0 50" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, on='C', left_index=True)" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
a100NaN200
b200250.0150
d400150.050
\n", "
" ], "text/plain": [ " A C B\n", "a 100 NaN 200\n", "b 200 250.0 150\n", "d 400 150.0 50" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, on='C', right_index=True)" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACB
b200250.0150
d400150.050
\n", "
" ], "text/plain": [ " A C B\n", "b 200 250.0 150\n", "d 400 150.0 50" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(df1, df2, on='C', left_index=True, right_index=True)" ] } ], "metadata": { "anaconda-cloud": {}, "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.6.8" } }, "nbformat": 4, "nbformat_minor": 1 }