{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# import\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Object Creation - Series and DataFrame" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 [1, 3, 5, nan, 6, 8]\n", "dtype: object" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creating Series (array)\n", "\n", "s1 = pd.Series([[1,3,5,np.nan,6,8]])\n", "s1" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creating DataFrames\n", "dates = pd.date_range('20130101', periods=6)\n", "dates" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-03-1.616674-0.042173-1.356455-0.717640
2013-01-042.156849-0.2012320.165786-0.162465
2013-01-05-2.019862-2.0552051.3694861.182199
2013-01-060.8152600.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))\n", "df" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "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", "
ABCDEF
01.02013-01-021.03testfoo
11.02013-01-021.03trainfoo
21.02013-01-021.03testfoo
31.02013-01-021.03trainfoo
\n", "
" ], "text/plain": [ " A B C D E F\n", "0 1.0 2013-01-02 1.0 3 test foo\n", "1 1.0 2013-01-02 1.0 3 train foo\n", "2 1.0 2013-01-02 1.0 3 test foo\n", "3 1.0 2013-01-02 1.0 3 train foo" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creating a DataFrame by passing a dict of objects that can be converted to series-like.\n", "df2 = pd.DataFrame({ 'A' : 1.,\n", " 'B' : pd.Timestamp('20130102'),\n", " 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),\n", " 'D' : np.array([3] * 4,dtype='int32'),\n", " 'E' : pd.Categorical([\"test\",\"train\",\"test\",\"train\"]),\n", " 'F' : 'foo' })\n", "df2\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A float64\n", "B datetime64[ns]\n", "C float32\n", "D int32\n", "E category\n", "F object\n", "dtype: object" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# checking Data Types\n", "df2.dtypes" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Use df2. for column name completion as well as attributes which can work on dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Viewing Data" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-03-1.616674-0.042173-1.356455-0.717640
2013-01-042.156849-0.2012320.165786-0.162465
2013-01-05-2.019862-2.0552051.3694861.182199
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# for first 5 records\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-042.156849-0.2012320.165786-0.162465
2013-01-05-2.019862-2.0552051.3694861.182199
2013-01-060.8152600.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# for last 3\n", "df.tail(3)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# checking df index\n", "df.index" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Index(['A', 'B', 'C', 'D'], dtype='object')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# column names\n", "df.columns" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-0.00557444, -0.38565665, -0.19326961, 0.26490064],\n", " [-0.20867983, -0.29648787, -0.79000981, -1.39103244],\n", " [-1.6166742 , -0.04217266, -1.35645484, -0.71763967],\n", " [ 2.15684898, -0.20123222, 0.16578647, -0.16246515],\n", " [-2.01986196, -2.05520516, 1.36948649, 1.18219902],\n", " [ 0.81525976, 0.76637688, 0.16043882, 0.35385518]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# df values\n", "df.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Summary of Data" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "DatetimeIndex: 6 entries, 2013-01-01 to 2013-01-06\n", "Freq: D\n", "Data columns (total 4 columns):\n", "A 6 non-null float64\n", "B 6 non-null float64\n", "C 6 non-null float64\n", "D 6 non-null float64\n", "dtypes: float64(4)\n", "memory usage: 240.0 bytes\n" ] } ], "source": [ "# information abt df\n", "df.info()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "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", "
ABCD
count6.0000006.0000006.0000006.000000
mean-0.146447-0.369063-0.107337-0.078364
std1.5443460.9244310.9339200.898054
min-2.019862-2.055205-1.356455-1.391032
25%-1.264676-0.363364-0.640825-0.578846
50%-0.107127-0.248860-0.0164150.051218
75%0.610051-0.0819380.1644500.331617
max2.1568490.7663771.3694861.182199
\n", "
" ], "text/plain": [ " A B C D\n", "count 6.000000 6.000000 6.000000 6.000000\n", "mean -0.146447 -0.369063 -0.107337 -0.078364\n", "std 1.544346 0.924431 0.933920 0.898054\n", "min -2.019862 -2.055205 -1.356455 -1.391032\n", "25% -1.264676 -0.363364 -0.640825 -0.578846\n", "50% -0.107127 -0.248860 -0.016415 0.051218\n", "75% 0.610051 -0.081938 0.164450 0.331617\n", "max 2.156849 0.766377 1.369486 1.182199" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# describing stastistic summay\n", "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Transposing and Sorting the data" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "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", "
2013-01-01 00:00:002013-01-02 00:00:002013-01-03 00:00:002013-01-04 00:00:002013-01-05 00:00:002013-01-06 00:00:00
A-0.005574-0.208680-1.6166742.156849-2.0198620.815260
B-0.385657-0.296488-0.042173-0.201232-2.0552050.766377
C-0.193270-0.790010-1.3564550.1657861.3694860.160439
D0.264901-1.391032-0.717640-0.1624651.1821990.353855
\n", "
" ], "text/plain": [ " 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06\n", "A -0.005574 -0.208680 -1.616674 2.156849 -2.019862 0.815260\n", "B -0.385657 -0.296488 -0.042173 -0.201232 -2.055205 0.766377\n", "C -0.193270 -0.790010 -1.356455 0.165786 1.369486 0.160439\n", "D 0.264901 -1.391032 -0.717640 -0.162465 1.182199 0.353855" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.T" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "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", "
DCBA
2013-01-010.264901-0.193270-0.385657-0.005574
2013-01-02-1.391032-0.790010-0.296488-0.208680
2013-01-03-0.717640-1.356455-0.042173-1.616674
2013-01-04-0.1624650.165786-0.2012322.156849
2013-01-051.1821991.369486-2.055205-2.019862
2013-01-060.3538550.1604390.7663770.815260
\n", "
" ], "text/plain": [ " D C B A\n", "2013-01-01 0.264901 -0.193270 -0.385657 -0.005574\n", "2013-01-02 -1.391032 -0.790010 -0.296488 -0.208680\n", "2013-01-03 -0.717640 -1.356455 -0.042173 -1.616674\n", "2013-01-04 -0.162465 0.165786 -0.201232 2.156849\n", "2013-01-05 1.182199 1.369486 -2.055205 -2.019862\n", "2013-01-06 0.353855 0.160439 0.766377 0.815260" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Sorting by index\n", "df.sort_index(axis=1, ascending=False)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-05-2.019862-2.0552051.3694861.182199
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-042.156849-0.2012320.165786-0.162465
2013-01-03-1.616674-0.042173-1.356455-0.717640
2013-01-060.8152600.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sorting by values\n", "df.sort_values(by=\"B\")" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-05-2.019862-2.0552051.3694861.182199
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-042.156849-0.2012320.165786-0.162465
2013-01-03-1.616674-0.042173-1.356455-0.717640
2013-01-060.8152600.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=[\"B\", \"A\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Selection of Data\n", "\n", "In pandas, data can be accessed with these methods ```.at, .iat, .loc, .iloc and .ix```" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 -0.005574\n", "2013-01-02 -0.208680\n", "2013-01-03 -1.616674\n", "2013-01-04 2.156849\n", "2013-01-05 -2.019862\n", "2013-01-06 0.815260\n", "Freq: D, Name: A, dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# selecting a column A\n", "df['A']" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-03-1.616674-0.042173-1.356455-0.717640
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# slicing rows\n", "df[0:3]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-01-0.005574-0.385657-0.1932700.264901
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-03-1.616674-0.042173-1.356455-0.717640
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2013-01-01':'2013-01-03']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Selection by lable" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A -0.005574\n", "B -0.385657\n", "C -0.193270\n", "D 0.264901\n", "Name: 2013-01-01 00:00:00, dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# cross selection using a lable\n", "df.loc[dates[0]]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "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", "
AB
2013-01-01-0.005574-0.385657
2013-01-02-0.208680-0.296488
2013-01-03-1.616674-0.042173
2013-01-042.156849-0.201232
2013-01-05-2.019862-2.055205
2013-01-060.8152600.766377
\n", "
" ], "text/plain": [ " A B\n", "2013-01-01 -0.005574 -0.385657\n", "2013-01-02 -0.208680 -0.296488\n", "2013-01-03 -1.616674 -0.042173\n", "2013-01-04 2.156849 -0.201232\n", "2013-01-05 -2.019862 -2.055205\n", "2013-01-06 0.815260 0.766377" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, ['A', 'B']] # [row, column]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "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", "
AB
2013-01-02-0.208680-0.296488
2013-01-03-1.616674-0.042173
2013-01-042.156849-0.201232
\n", "
" ], "text/plain": [ " A B\n", "2013-01-02 -0.208680 -0.296488\n", "2013-01-03 -1.616674 -0.042173\n", "2013-01-04 2.156849 -0.201232" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Showing label slicing, both endpoints are included\n", "df.loc['20130102':'20130104',['A','B']]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A -0.208680\n", "B -0.296488\n", "Name: 2013-01-02 00:00:00, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102',['A','B']]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A -0.20868\n", "Name: 2013-01-02 00:00:00, dtype: float64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For getting a scalar value\n", "df.loc['20130102',['A']]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.29648786843717295" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102','B']" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# for faster access\n", "#df.at['20130102', 'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Selection by Position" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A 2.156849\n", "B -0.201232\n", "C 0.165786\n", "D -0.162465\n", "Name: 2013-01-04 00:00:00, dtype: float64" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Select via the position of the passed integers\n", "df.iloc[3]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "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", "
CD
2013-01-040.165786-0.162465
2013-01-051.3694861.182199
\n", "
" ], "text/plain": [ " C D\n", "2013-01-04 0.165786 -0.162465\n", "2013-01-05 1.369486 1.182199" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# By integer slices, acting similar to numpy/python\n", "df.iloc[3:5, 2:4] # row - 3 n 4 , col = 2, 3" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "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", "
CD
2013-01-02-0.790010-1.391032
2013-01-040.165786-0.162465
2013-01-051.3694861.182199
\n", "
" ], "text/plain": [ " C D\n", "2013-01-02 -0.790010 -1.391032\n", "2013-01-04 0.165786 -0.162465\n", "2013-01-05 1.369486 1.182199" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# By lists of integer position locations, similar to the numpy/python style\n", "df.iloc[[1,3,4], 2:4]" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-02-0.208680-0.296488-0.790010-1.391032
2013-01-03-1.616674-0.042173-1.356455-0.717640
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For slicing rows explicitly\n", "df.iloc[1:3,:]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "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", "
BC
2013-01-01-0.385657-0.193270
2013-01-02-0.296488-0.790010
2013-01-03-0.042173-1.356455
2013-01-04-0.2012320.165786
2013-01-05-2.0552051.369486
2013-01-060.7663770.160439
\n", "
" ], "text/plain": [ " B C\n", "2013-01-01 -0.385657 -0.193270\n", "2013-01-02 -0.296488 -0.790010\n", "2013-01-03 -0.042173 -1.356455\n", "2013-01-04 -0.201232 0.165786\n", "2013-01-05 -2.055205 1.369486\n", "2013-01-06 0.766377 0.160439" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For slicing columns explicitly\n", "df.iloc[:,1:3]" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.29648786843717295" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For getting a value explicitly\n", "df.iloc[1,1]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.29648786843717295" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['2013-01-02', 'B']" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.29648786843717295" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For getting fast access to a scalar (equiv to the prior method)\n", "df.iat[1,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Boolean Indexing" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 False\n", "2013-01-02 False\n", "2013-01-03 False\n", "2013-01-04 False\n", "2013-01-05 False\n", "2013-01-06 True\n", "Freq: D, Name: B, dtype: bool" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.B > 0" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-060.815260.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-06 0.81526 0.766377 0.160439 0.353855" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.B > 0]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "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", "
ABCD
2013-01-01NaNNaNNaN0.264901
2013-01-02NaNNaNNaNNaN
2013-01-03NaNNaNNaNNaN
2013-01-042.156849NaN0.165786NaN
2013-01-05NaNNaN1.3694861.182199
2013-01-060.8152600.7663770.1604390.353855
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 NaN NaN NaN 0.264901\n", "2013-01-02 NaN NaN NaN NaN\n", "2013-01-03 NaN NaN NaN NaN\n", "2013-01-04 2.156849 NaN 0.165786 NaN\n", "2013-01-05 NaN NaN 1.369486 1.182199\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df>0]" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "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", "
ABCDE
2013-01-01-0.005574-0.385657-0.1932700.264901one
2013-01-02-0.208680-0.296488-0.790010-1.391032one
2013-01-03-1.616674-0.042173-1.356455-0.717640two
2013-01-042.156849-0.2012320.165786-0.162465three
2013-01-05-2.019862-2.0552051.3694861.182199four
2013-01-060.8152600.7663770.1604390.353855three
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901 one\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032 one\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640 two\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465 three\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199 four\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855 three" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Using the isin() method for filtering:\n", "df3 = df.copy()\n", "\n", "df3['E'] = ['one', 'one','two','three','four','three']\n", "\n", "df3" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "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", "
ABCDE
2013-01-03-1.616674-0.042173-1.356455-0.717640two
2013-01-05-2.019862-2.0552051.3694861.182199four
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640 two\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199 four" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3[df3['E'].isin(['two','four'])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Setting a new column" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-02 1\n", "2013-01-03 2\n", "2013-01-04 3\n", "2013-01-05 4\n", "2013-01-06 5\n", "2013-01-07 6\n", "Freq: D, dtype: int64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))\n", "s1" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-01-0.005574-0.385657-0.1932700.264901NaN
2013-01-02-0.208680-0.296488-0.790010-1.3910321.0
2013-01-03-1.616674-0.042173-1.356455-0.7176402.0
2013-01-042.156849-0.2012320.165786-0.1624653.0
2013-01-05-2.019862-2.0552051.3694861.1821994.0
2013-01-060.8152600.7663770.1604390.3538555.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 -0.005574 -0.385657 -0.193270 0.264901 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640 2.0\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465 3.0\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855 5.0" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['F'] = s1\n", "df" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.000000-0.385657-0.1932700.264901NaN
2013-01-02-0.208680-0.296488-0.790010-1.3910321.0
2013-01-03-1.616674-0.042173-1.356455-0.7176402.0
2013-01-042.156849-0.2012320.165786-0.1624653.0
2013-01-05-2.019862-2.0552051.3694861.1821994.0
2013-01-060.8152600.7663770.1604390.3538555.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 -0.385657 -0.193270 0.264901 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640 2.0\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465 3.0\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855 5.0" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Setting values by label\n", "df.at[dates[0],'A'] = 0\n", "df" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.000000-0.1932700.264901NaN
2013-01-02-0.208680-0.296488-0.790010-1.3910321.0
2013-01-03-1.616674-0.042173-1.356455-0.7176402.0
2013-01-042.156849-0.2012320.165786-0.1624653.0
2013-01-05-2.019862-2.0552051.3694861.1821994.0
2013-01-060.8152600.7663770.1604390.3538555.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.193270 0.264901 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -1.391032 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -0.717640 2.0\n", "2013-01-04 2.156849 -0.201232 0.165786 -0.162465 3.0\n", "2013-01-05 -2.019862 -2.055205 1.369486 1.182199 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 0.353855 5.0" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Setting values by position\n", "df.iat[0,1] = 0\n", "df" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.000000-0.1932705NaN
2013-01-02-0.208680-0.296488-0.79001051.0
2013-01-03-1.616674-0.042173-1.35645552.0
2013-01-042.156849-0.2012320.16578653.0
2013-01-05-2.019862-2.0552051.36948654.0
2013-01-060.8152600.7663770.16043955.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0\n", "2013-01-05 -2.019862 -2.055205 1.369486 5 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 5 5.0" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Setting by assigning with a numpy array\n", "df.loc[:,'D'] = np.array([5] * len(df))\n", "df" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.000000-0.1932705NaN
2013-01-02-0.208680-0.296488-0.79001051.0
2013-01-03-1.616674-0.042173-1.35645552.0
2013-01-042.156849-0.2012320.16578653.0
2013-01-05-2.019862-2.0552051.36948654.0
2013-01-060.8152600.7663770.16043955.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0\n", "2013-01-05 -2.019862 -2.055205 1.369486 5 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 5 5.0" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df.copy()\n", "df2" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.000000-0.193270-5NaN
2013-01-02-0.208680-0.296488-0.790010-5-1.0
2013-01-03-1.616674-0.042173-1.356455-5-2.0
2013-01-04-2.156849-0.201232-0.165786-5-3.0
2013-01-05-2.019862-2.055205-1.369486-5-4.0
2013-01-06-0.815260-0.766377-0.160439-5-5.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.193270 -5 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 -5 -1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 -5 -2.0\n", "2013-01-04 -2.156849 -0.201232 -0.165786 -5 -3.0\n", "2013-01-05 -2.019862 -2.055205 -1.369486 -5 -4.0\n", "2013-01-06 -0.815260 -0.766377 -0.160439 -5 -5.0" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# to replace all the positive value from its negative\n", "\n", "df2[df2 > 0] = -df2\n", "df2" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.0000000.1932705NaN
2013-01-020.2086800.2964880.79001051.0
2013-01-031.6166740.0421731.35645552.0
2013-01-042.1568490.2012320.16578653.0
2013-01-052.0198622.0552051.36948654.0
2013-01-060.8152600.7663770.16043955.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 0.193270 5 NaN\n", "2013-01-02 0.208680 0.296488 0.790010 5 1.0\n", "2013-01-03 1.616674 0.042173 1.356455 5 2.0\n", "2013-01-04 2.156849 0.201232 0.165786 5 3.0\n", "2013-01-05 2.019862 2.055205 1.369486 5 4.0\n", "2013-01-06 0.815260 0.766377 0.160439 5 5.0" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2[df2 < 0] = -df2\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Missing Data" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.1932705NaNNaN
2013-01-02-0.208680-0.296488-0.79001051.0NaN
2013-01-03-1.616674-0.042173-1.35645552.0NaN
2013-01-042.156849-0.2012320.16578653.0NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 NaN\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 NaN\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 NaN" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data.\n", "df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])\n", "df1" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.1932705NaNNaN
2013-01-02-0.208680-0.296488-0.79001051.01.0
2013-01-03-1.616674-0.042173-1.35645552.0NaN
2013-01-042.156849-0.2012320.16578653.0NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 NaN\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 NaN" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.loc[dates[1],'E'] = 1\n", "df1" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-02-0.20868-0.296488-0.7900151.01.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-02 -0.20868 -0.296488 -0.79001 5 1.0 1.0" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# to drop any rows that have missing data.\n", "df1.dropna(how='any') # if any columns have NULL or NaN" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-02-0.20868-0.296488-0.7900151.01.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-02 -0.20868 -0.296488 -0.79001 5 1.0 1.0" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.dropna()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.1932705NaNNaN
2013-01-02-0.208680-0.296488-0.79001051.01.0
2013-01-03-1.616674-0.042173-1.35645552.0NaN
2013-01-042.156849-0.2012320.16578653.0NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN NaN\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 NaN\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 NaN" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.dropna(how='all') # if ALL columns have NULL or NaN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Filling missing data" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.19327053.03.0
2013-01-02-0.208680-0.296488-0.79001051.01.0
2013-01-03-1.616674-0.042173-1.35645552.03.0
2013-01-042.156849-0.2012320.16578653.03.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 3.0 3.0\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 3.0\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 3.0" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.fillna(3)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.19327054.04.0
2013-01-02-0.208680-0.296488-0.79001051.01.0
2013-01-03-1.616674-0.042173-1.35645552.04.0
2013-01-042.156849-0.2012320.16578653.04.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 4.0 4.0\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 4.0\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 4.0" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.fillna(value=4)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-010.0000000.000000-0.19327053.02.9
2013-01-02-0.208680-0.296488-0.79001051.01.0
2013-01-03-1.616674-0.042173-1.35645552.02.9
2013-01-042.156849-0.2012320.16578653.02.9
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.193270 5 3.0 2.9\n", "2013-01-02 -0.208680 -0.296488 -0.790010 5 1.0 1.0\n", "2013-01-03 -1.616674 -0.042173 -1.356455 5 2.0 2.9\n", "2013-01-04 2.156849 -0.201232 0.165786 5 3.0 2.9" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.fillna({'F':3, 'E':2.9}) # Fill F column with 3 and E column wih 2.9" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "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", "
ABCDFE
2013-01-01FalseFalseFalseFalseTrueTrue
2013-01-02FalseFalseFalseFalseFalseFalse
2013-01-03FalseFalseFalseFalseFalseTrue
2013-01-04FalseFalseFalseFalseFalseTrue
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 False False False False True True\n", "2013-01-02 False False False False False False\n", "2013-01-03 False False False False False True\n", "2013-01-04 False False False False False True" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.isnull(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Stats" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "DatetimeIndex: 6 entries, 2013-01-01 to 2013-01-06\n", "Freq: D\n", "Data columns (total 5 columns):\n", "A 6 non-null float64\n", "B 6 non-null float64\n", "C 6 non-null float64\n", "D 6 non-null int32\n", "F 5 non-null float64\n", "dtypes: float64(4), int32(1)\n", "memory usage: 264.0 bytes\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "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", "
ABCDF
count6.0000006.0000006.0000006.05.000000
mean-0.145518-0.304787-0.1073375.03.000000
std1.5444490.9363770.9339200.01.581139
min-2.019862-2.055205-1.3564555.01.000000
25%-1.264676-0.272674-0.6408255.02.000000
50%-0.104340-0.121702-0.0164155.03.000000
75%0.611445-0.0105430.1644505.04.000000
max2.1568490.7663771.3694865.05.000000
\n", "
" ], "text/plain": [ " A B C D F\n", "count 6.000000 6.000000 6.000000 6.0 5.000000\n", "mean -0.145518 -0.304787 -0.107337 5.0 3.000000\n", "std 1.544449 0.936377 0.933920 0.0 1.581139\n", "min -2.019862 -2.055205 -1.356455 5.0 1.000000\n", "25% -1.264676 -0.272674 -0.640825 5.0 2.000000\n", "50% -0.104340 -0.121702 -0.016415 5.0 3.000000\n", "75% 0.611445 -0.010543 0.164450 5.0 4.000000\n", "max 2.156849 0.766377 1.369486 5.0 5.000000" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A 6\n", "B 6\n", "C 6\n", "D 6\n", "F 5\n", "dtype: int64" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.count()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A -0.145518\n", "B -0.304787\n", "C -0.107337\n", "D 5.000000\n", "F 3.000000\n", "dtype: float64" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean() # column wise" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 1.201683\n", "2013-01-02 0.940964\n", "2013-01-03 0.796940\n", "2013-01-04 2.024281\n", "2013-01-05 1.258884\n", "2013-01-06 2.348415\n", "Freq: D, dtype: float64" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean(1) # row wise" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A 1.544449\n", "B 0.936377\n", "C 0.933920\n", "D 0.000000\n", "F 1.581139\n", "dtype: float64" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.std()" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 2.533850\n", "2013-01-02 2.362652\n", "2013-01-03 2.751355\n", "2013-01-04 2.134913\n", "2013-01-05 3.288437\n", "2013-01-06 2.434258\n", "Freq: D, dtype: float64" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.std(1)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 1.0\n", "2013-01-02 3.0\n", "2013-01-03 5.0\n", "2013-01-04 NaN\n", "2013-01-05 6.0\n", "2013-01-06 8.0\n", "Freq: D, dtype: float64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([1,3,5,np.nan,6,8], index=dates)\n", "s" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 NaN\n", "2013-01-02 NaN\n", "2013-01-03 1.0\n", "2013-01-04 3.0\n", "2013-01-05 5.0\n", "2013-01-06 NaN\n", "Freq: D, dtype: float64" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = s.shift(2) # shifting the content by 2 index\n", "s" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-01NaNNaNNaNNaNNaN
2013-01-02NaNNaNNaNNaNNaN
2013-01-03-2.616674-1.042173-2.3564554.01.0
2013-01-04-0.843151-3.201232-2.8342142.00.0
2013-01-05-7.019862-7.055205-3.6305140.0-1.0
2013-01-06NaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 NaN NaN NaN NaN NaN\n", "2013-01-02 NaN NaN NaN NaN NaN\n", "2013-01-03 -2.616674 -1.042173 -2.356455 4.0 1.0\n", "2013-01-04 -0.843151 -3.201232 -2.834214 2.0 0.0\n", "2013-01-05 -7.019862 -7.055205 -3.630514 0.0 -1.0\n", "2013-01-06 NaN NaN NaN NaN NaN" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ " df.sub(s, axis='index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Apply" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "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", "
ABCDF
2013-01-010.0000000.000000-0.1932705NaN
2013-01-02-0.208680-0.296488-0.983279101.0
2013-01-03-1.825354-0.338661-2.339734153.0
2013-01-040.331495-0.539893-2.173948206.0
2013-01-05-1.688367-2.595098-0.8044612510.0
2013-01-06-0.873107-1.828721-0.6440223015.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.193270 5 NaN\n", "2013-01-02 -0.208680 -0.296488 -0.983279 10 1.0\n", "2013-01-03 -1.825354 -0.338661 -2.339734 15 3.0\n", "2013-01-04 0.331495 -0.539893 -2.173948 20 6.0\n", "2013-01-05 -1.688367 -2.595098 -0.804461 25 10.0\n", "2013-01-06 -0.873107 -1.828721 -0.644022 30 15.0" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(np.cumsum)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A 4.176711\n", "B 2.821582\n", "C 2.725941\n", "D 0.000000\n", "F 4.000000\n", "dtype: float64" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(lambda x: x.max() - x.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Histogramming" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 1\n", "2 5\n", "3 0\n", "4 0\n", "5 1\n", "6 4\n", "7 4\n", "8 3\n", "9 0\n", "dtype: int32" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(np.random.randint(0, 7, size=10))\n", "s" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 4\n", "4 2\n", "1 2\n", "5 1\n", "3 1\n", "dtype: int64" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.value_counts() # checking unique value counts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### String Methods" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 A\n", "1 B\n", "2 C\n", "3 Aaba\n", "4 Baca\n", "5 NaN\n", "6 CABA\n", "7 dog\n", "8 cat\n", "dtype: object" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])\n", "s" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 c\n", "3 aaba\n", "4 baca\n", "5 NaN\n", "6 caba\n", "7 dog\n", "8 cat\n", "dtype: object" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.str.lower()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Merge\n", "1. Concat" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "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", "
0123
00.862392-0.4874481.7670441.619584
1-0.1925330.4521530.1604910.163961
20.646025-0.710062-0.7647482.061172
3-1.356019-0.077627-0.9471330.952742
40.8833361.352857-1.9605701.267786
51.811561-2.001506-0.595290-0.820276
6-2.535877-0.415728-0.000989-1.231573
7-0.0219011.382943-0.957129-0.228767
80.813857-0.8647181.9812061.672659
9-0.4432680.921847-0.5486030.190629
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 0.862392 -0.487448 1.767044 1.619584\n", "1 -0.192533 0.452153 0.160491 0.163961\n", "2 0.646025 -0.710062 -0.764748 2.061172\n", "3 -1.356019 -0.077627 -0.947133 0.952742\n", "4 0.883336 1.352857 -1.960570 1.267786\n", "5 1.811561 -2.001506 -0.595290 -0.820276\n", "6 -2.535877 -0.415728 -0.000989 -1.231573\n", "7 -0.021901 1.382943 -0.957129 -0.228767\n", "8 0.813857 -0.864718 1.981206 1.672659\n", "9 -0.443268 0.921847 -0.548603 0.190629" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(10, 4))\n", "df" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[ 0 1 2 3\n", " 0 0.862392 -0.487448 1.767044 1.619584\n", " 1 -0.192533 0.452153 0.160491 0.163961\n", " 2 0.646025 -0.710062 -0.764748 2.061172,\n", " 0 1 2 3\n", " 3 -1.356019 -0.077627 -0.947133 0.952742\n", " 4 0.883336 1.352857 -1.960570 1.267786\n", " 5 1.811561 -2.001506 -0.595290 -0.820276\n", " 6 -2.535877 -0.415728 -0.000989 -1.231573,\n", " 0 1 2 3\n", " 7 -0.021901 1.382943 -0.957129 -0.228767\n", " 8 0.813857 -0.864718 1.981206 1.672659\n", " 9 -0.443268 0.921847 -0.548603 0.190629]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pieces = [df[:3], df[3:7], df[7:]]\n", "pieces" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "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", "
0123
00.862392-0.4874481.7670441.619584
1-0.1925330.4521530.1604910.163961
20.646025-0.710062-0.7647482.061172
3-1.356019-0.077627-0.9471330.952742
40.8833361.352857-1.9605701.267786
51.811561-2.001506-0.595290-0.820276
6-2.535877-0.415728-0.000989-1.231573
7-0.0219011.382943-0.957129-0.228767
80.813857-0.8647181.9812061.672659
9-0.4432680.921847-0.5486030.190629
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 0.862392 -0.487448 1.767044 1.619584\n", "1 -0.192533 0.452153 0.160491 0.163961\n", "2 0.646025 -0.710062 -0.764748 2.061172\n", "3 -1.356019 -0.077627 -0.947133 0.952742\n", "4 0.883336 1.352857 -1.960570 1.267786\n", "5 1.811561 -2.001506 -0.595290 -0.820276\n", "6 -2.535877 -0.415728 -0.000989 -1.231573\n", "7 -0.021901 1.382943 -0.957129 -0.228767\n", "8 0.813857 -0.864718 1.981206 1.672659\n", "9 -0.443268 0.921847 -0.548603 0.190629" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat(pieces) # concat rowwise" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012301230123
00.862392-0.4874481.7670441.619584NaNNaNNaNNaNNaNNaNNaNNaN
1-0.1925330.4521530.1604910.163961NaNNaNNaNNaNNaNNaNNaNNaN
20.646025-0.710062-0.7647482.061172NaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaN-1.356019-0.077627-0.9471330.952742NaNNaNNaNNaN
4NaNNaNNaNNaN0.8833361.352857-1.9605701.267786NaNNaNNaNNaN
5NaNNaNNaNNaN1.811561-2.001506-0.595290-0.820276NaNNaNNaNNaN
6NaNNaNNaNNaN-2.535877-0.415728-0.000989-1.231573NaNNaNNaNNaN
7NaNNaNNaNNaNNaNNaNNaNNaN-0.0219011.382943-0.957129-0.228767
8NaNNaNNaNNaNNaNNaNNaNNaN0.813857-0.8647181.9812061.672659
9NaNNaNNaNNaNNaNNaNNaNNaN-0.4432680.921847-0.5486030.190629
\n", "
" ], "text/plain": [ " 0 1 2 3 0 1 2 \\\n", "0 0.862392 -0.487448 1.767044 1.619584 NaN NaN NaN \n", "1 -0.192533 0.452153 0.160491 0.163961 NaN NaN NaN \n", "2 0.646025 -0.710062 -0.764748 2.061172 NaN NaN NaN \n", "3 NaN NaN NaN NaN -1.356019 -0.077627 -0.947133 \n", "4 NaN NaN NaN NaN 0.883336 1.352857 -1.960570 \n", "5 NaN NaN NaN NaN 1.811561 -2.001506 -0.595290 \n", "6 NaN NaN NaN NaN -2.535877 -0.415728 -0.000989 \n", "7 NaN NaN NaN NaN NaN NaN NaN \n", "8 NaN NaN NaN NaN NaN NaN NaN \n", "9 NaN NaN NaN NaN NaN NaN NaN \n", "\n", " 3 0 1 2 3 \n", "0 NaN NaN NaN NaN NaN \n", "1 NaN NaN NaN NaN NaN \n", "2 NaN NaN NaN NaN NaN \n", "3 0.952742 NaN NaN NaN NaN \n", "4 1.267786 NaN NaN NaN NaN \n", "5 -0.820276 NaN NaN NaN NaN \n", "6 -1.231573 NaN NaN NaN NaN \n", "7 NaN -0.021901 1.382943 -0.957129 -0.228767 \n", "8 NaN 0.813857 -0.864718 1.981206 1.672659 \n", "9 NaN -0.443268 0.921847 -0.548603 0.190629 " ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat(pieces, axis=1) # concat column wise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Join\n", "\n", "```\n", "pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,\n", " left_index=False, right_index=False, sort=True,\n", " suffixes=('_x', '_y'), copy=True, indicator=False)\n", "```" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "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", "
keylval
0foo1
1foo2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 foo 2" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})\n", "right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})\n", "\n", "left" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "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", "
keyrval
0foo4
1foo5
\n", "
" ], "text/plain": [ " key rval\n", "0 foo 4\n", "1 foo 5" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "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", "
keylvalrval
0foo14
1foo15
2foo24
3foo25
\n", "
" ], "text/plain": [ " key lval rval\n", "0 foo 1 4\n", "1 foo 1 5\n", "2 foo 2 4\n", "3 foo 2 5" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "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", "
keylval
0foo1
1bar2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 bar 2" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})\n", "right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})\n", "\n", "left" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "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", "
keylvalrval
0foo14
1bar25
\n", "
" ], "text/plain": [ " key lval rval\n", "0 foo 1 4\n", "1 bar 2 5" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Append" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "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", "
ABCD
0-0.770577-0.170541-1.076229-0.451980
11.9167600.5727131.1641400.632860
2-1.005490-1.477879-0.1109880.870474
3-0.3161360.618400-1.937116-0.129132
40.175017-0.135414-0.0889021.275741
50.385744-0.969253-0.3076940.746990
61.229319-1.976747-0.2437750.166781
7-0.940357-0.8947590.2020370.233910
\n", "
" ], "text/plain": [ " A B C D\n", "0 -0.770577 -0.170541 -1.076229 -0.451980\n", "1 1.916760 0.572713 1.164140 0.632860\n", "2 -1.005490 -1.477879 -0.110988 0.870474\n", "3 -0.316136 0.618400 -1.937116 -0.129132\n", "4 0.175017 -0.135414 -0.088902 1.275741\n", "5 0.385744 -0.969253 -0.307694 0.746990\n", "6 1.229319 -1.976747 -0.243775 0.166781\n", "7 -0.940357 -0.894759 0.202037 0.233910" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])\n", "df" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "A -0.316136\n", "B 0.618400\n", "C -1.937116\n", "D -0.129132\n", "Name: 3, dtype: float64" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = df.iloc[3]\n", "s" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "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", "
ABCD
0-0.770577-0.170541-1.076229-0.451980
11.9167600.5727131.1641400.632860
2-1.005490-1.477879-0.1109880.870474
3-0.3161360.618400-1.937116-0.129132
40.175017-0.135414-0.0889021.275741
50.385744-0.969253-0.3076940.746990
61.229319-1.976747-0.2437750.166781
7-0.940357-0.8947590.2020370.233910
\n", "
" ], "text/plain": [ " A B C D\n", "0 -0.770577 -0.170541 -1.076229 -0.451980\n", "1 1.916760 0.572713 1.164140 0.632860\n", "2 -1.005490 -1.477879 -0.110988 0.870474\n", "3 -0.316136 0.618400 -1.937116 -0.129132\n", "4 0.175017 -0.135414 -0.088902 1.275741\n", "5 0.385744 -0.969253 -0.307694 0.746990\n", "6 1.229319 -1.976747 -0.243775 0.166781\n", "7 -0.940357 -0.894759 0.202037 0.233910" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.append(s, ignore_index=True)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Grouping\n", "\n", "By “group by” we are referring to a process involving one or more of the following steps\n", "\n", " Splitting the data into groups based on some criteria\n", " Applying a function to each group independently\n", " Combining the results into a data structure" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "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", "
ABCD
0fooone0.206509-0.437572
1barone-1.189741-0.096997
2footwo1.289879-0.130252
3barthree0.1030440.251160
4footwo1.495027-1.839108
5bartwo1.084158-0.955764
6fooone0.0640890.721713
7foothree-1.1740131.183452
\n", "
" ], "text/plain": [ " A B C D\n", "0 foo one 0.206509 -0.437572\n", "1 bar one -1.189741 -0.096997\n", "2 foo two 1.289879 -0.130252\n", "3 bar three 0.103044 0.251160\n", "4 foo two 1.495027 -1.839108\n", "5 bar two 1.084158 -0.955764\n", "6 foo one 0.064089 0.721713\n", "7 foo three -1.174013 1.183452" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',\n", " 'foo', 'bar', 'foo', 'foo'],\n", " 'B' : ['one', 'one', 'two', 'three',\n", " 'two', 'two', 'one', 'three'],\n", " 'C' : np.random.randn(8),\n", " 'D' : np.random.randn(8)})\n", "df" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "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", "
CD
A
bar-0.002539-0.801601
foo1.881491-0.501767
\n", "
" ], "text/plain": [ " C D\n", "A \n", "bar -0.002539 -0.801601\n", "foo 1.881491 -0.501767" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('A').sum()" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "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", "
CD
AB
barone-1.189741-0.096997
three0.1030440.251160
two1.084158-0.955764
fooone0.2705980.284141
three-1.1740131.183452
two2.784906-1.969361
\n", "
" ], "text/plain": [ " C D\n", "A B \n", "bar one -1.189741 -0.096997\n", " three 0.103044 0.251160\n", " two 1.084158 -0.955764\n", "foo one 0.270598 0.284141\n", " three -1.174013 1.183452\n", " two 2.784906 -1.969361" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(['A','B']).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Reshaping" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],\n", " labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],\n", " names=['first', 'second'])" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',\n", " 'foo', 'foo', 'qux', 'qux'],\n", " ['one', 'two', 'one', 'two',\n", " 'one', 'two', 'one', 'two']]))\n", "index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])\n", "index" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "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", "
AB
firstsecond
barone0.0771030.071665
two0.2434690.789529
bazone-0.4529060.148716
two-0.829278-1.180111
fooone-0.251384-0.004602
two-0.8574810.512469
quxone1.660127-1.580966
two0.521759-1.693887
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one 0.077103 0.071665\n", " two 0.243469 0.789529\n", "baz one -0.452906 0.148716\n", " two -0.829278 -1.180111\n", "foo one -0.251384 -0.004602\n", " two -0.857481 0.512469\n", "qux one 1.660127 -1.580966\n", " two 0.521759 -1.693887" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The stack() method “compresses” a level in the DataFrame’s columns" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "first second \n", "bar one A 0.077103\n", " B 0.071665\n", " two A 0.243469\n", " B 0.789529\n", "baz one A -0.452906\n", " B 0.148716\n", " two A -0.829278\n", " B -1.180111\n", "foo one A -0.251384\n", " B -0.004602\n", " two A -0.857481\n", " B 0.512469\n", "qux one A 1.660127\n", " B -1.580966\n", " two A 0.521759\n", " B -1.693887\n", "dtype: float64" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.stack()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With a “stacked” DataFrame or Series (having a MultiIndex as the index), the inverse operation of stack() is unstack(), which by default unstacks the last level:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "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", "
AB
secondonetwoonetwo
first
bar0.0771030.2434690.0716650.789529
baz-0.452906-0.8292780.148716-1.180111
foo-0.251384-0.857481-0.0046020.512469
qux1.6601270.521759-1.580966-1.693887
\n", "
" ], "text/plain": [ " A B \n", "second one two one two\n", "first \n", "bar 0.077103 0.243469 0.071665 0.789529\n", "baz -0.452906 -0.829278 0.148716 -1.180111\n", "foo -0.251384 -0.857481 -0.004602 0.512469\n", "qux 1.660127 0.521759 -1.580966 -1.693887" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.unstack() # this will unstack the inner index (last level)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "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", "
AB
firstbarbazfooquxbarbazfooqux
second
one0.077103-0.452906-0.2513841.6601270.0716650.148716-0.004602-1.580966
two0.243469-0.829278-0.8574810.5217590.789529-1.1801110.512469-1.693887
\n", "
" ], "text/plain": [ " A B \\\n", "first bar baz foo qux bar baz foo \n", "second \n", "one 0.077103 -0.452906 -0.251384 1.660127 0.071665 0.148716 -0.004602 \n", "two 0.243469 -0.829278 -0.857481 0.521759 0.789529 -1.180111 0.512469 \n", "\n", " \n", "first qux \n", "second \n", "one -1.580966 \n", "two -1.693887 " ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.unstack('first') # unstacking by lable" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "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", "
AB
secondonetwoonetwo
first
bar0.0771030.2434690.0716650.789529
baz-0.452906-0.8292780.148716-1.180111
foo-0.251384-0.857481-0.0046020.512469
qux1.6601270.521759-1.580966-1.693887
\n", "
" ], "text/plain": [ " A B \n", "second one two one two\n", "first \n", "bar 0.077103 0.243469 0.071665 0.789529\n", "baz -0.452906 -0.829278 0.148716 -1.180111\n", "foo -0.251384 -0.857481 -0.004602 0.512469\n", "qux 1.660127 0.521759 -1.580966 -1.693887" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.unstack('second') " ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "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", "
AB
firstbarbazfooquxbarbazfooqux
second
one0.077103-0.452906-0.2513841.6601270.0716650.148716-0.004602-1.580966
two0.243469-0.829278-0.8574810.5217590.789529-1.1801110.512469-1.693887
\n", "
" ], "text/plain": [ " A B \\\n", "first bar baz foo qux bar baz foo \n", "second \n", "one 0.077103 -0.452906 -0.251384 1.660127 0.071665 0.148716 -0.004602 \n", "two 0.243469 -0.829278 -0.857481 0.521759 0.789529 -1.180111 0.512469 \n", "\n", " \n", "first qux \n", "second \n", "one -1.580966 \n", "two -1.693887 " ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.unstack(0) # unstacking by index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Pivot Tables" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
0oneAfoo0.869958-2.824236
1oneBfoo-1.2632180.101729
2twoCfoo-0.7437231.409101
3threeAbar0.2923530.282451
4oneBbar-0.091658-0.752110
5oneCbar1.295819-0.448113
6twoAfoo1.5738410.196957
7threeBfoo-0.6458141.409150
8oneCfoo0.635127-1.389018
9oneAbar-1.174726-0.077247
10twoBbar1.264011-1.072017
11threeCbar1.4417320.543449
\n", "
" ], "text/plain": [ " A B C D E\n", "0 one A foo 0.869958 -2.824236\n", "1 one B foo -1.263218 0.101729\n", "2 two C foo -0.743723 1.409101\n", "3 three A bar 0.292353 0.282451\n", "4 one B bar -0.091658 -0.752110\n", "5 one C bar 1.295819 -0.448113\n", "6 two A foo 1.573841 0.196957\n", "7 three B foo -0.645814 1.409150\n", "8 one C foo 0.635127 -1.389018\n", "9 one A bar -1.174726 -0.077247\n", "10 two B bar 1.264011 -1.072017\n", "11 three C bar 1.441732 0.543449" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,\n", " 'B' : ['A', 'B', 'C'] * 4,\n", " 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,\n", " 'D' : np.random.randn(12),\n", " 'E' : np.random.randn(12)})\n", "df" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "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", "
Cbarfoo
AB
oneA-1.1747260.869958
B-0.091658-1.263218
C1.2958190.635127
threeA0.292353NaN
BNaN-0.645814
C1.441732NaN
twoANaN1.573841
B1.264011NaN
CNaN-0.743723
\n", "
" ], "text/plain": [ "C bar foo\n", "A B \n", "one A -1.174726 0.869958\n", " B -0.091658 -1.263218\n", " C 1.295819 0.635127\n", "three A 0.292353 NaN\n", " B NaN -0.645814\n", " C 1.441732 NaN\n", "two A NaN 1.573841\n", " B 1.264011 NaN\n", " C NaN -0.743723" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Time Series" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 00:00:01',\n", " '2012-01-01 00:00:02', '2012-01-01 00:00:03',\n", " '2012-01-01 00:00:04'],\n", " dtype='datetime64[ns]', freq='S')" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2012', periods=100, freq='S')\n", "rng[:5]" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-01-01 00:00:00 0\n", "2012-01-01 00:00:01 175\n", "2012-01-01 00:00:02 9\n", "2012-01-01 00:00:03 173\n", "2012-01-01 00:00:04 285\n", "2012-01-01 00:00:05 262\n", "2012-01-01 00:00:06 148\n", "2012-01-01 00:00:07 255\n", "Freq: S, dtype: int32" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)\n", "ts[:8]" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "26318" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.sum()" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-01-01 26318\n", "Freq: 5T, dtype: int32" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.resample('5Min').sum()" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Anaconda3\\lib\\site-packages\\IPython\\lib\\pretty.py:108: FutureWarning: .resample() is now a deferred operation\n", "use .resample(...).mean() instead of .resample(...)\n", " return getattr(obj, attr, default)\n" ] }, { "data": { "text/plain": [ "DatetimeIndexResampler [freq=<5 * Minutes>, axis=0, closed=left, label=left, convention=start, base=0]" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.resample('5Min')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Time zone representation" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2012-03-06', '2012-03-07', '2012-03-08', '2012-03-09',\n", " '2012-03-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')\n", "rng" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-03-06 1.166836\n", "2012-03-07 0.309653\n", "2012-03-08 0.953754\n", "2012-03-09 0.606327\n", "2012-03-10 -0.804818\n", "Freq: D, dtype: float64" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randn(len(rng)), rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-03-06 00:00:00+00:00 1.166836\n", "2012-03-07 00:00:00+00:00 0.309653\n", "2012-03-08 00:00:00+00:00 0.953754\n", "2012-03-09 00:00:00+00:00 0.606327\n", "2012-03-10 00:00:00+00:00 -0.804818\n", "Freq: D, dtype: float64" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc = ts.tz_localize('UTC')\n", "ts_utc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convert to another time zone" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-03-06 05:30:00+05:30 1.166836\n", "2012-03-07 05:30:00+05:30 0.309653\n", "2012-03-08 05:30:00+05:30 0.953754\n", "2012-03-09 05:30:00+05:30 0.606327\n", "2012-03-10 05:30:00+05:30 -0.804818\n", "Freq: D, dtype: float64" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc.tz_convert('Asia/Calcutta')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Converting between time span representations" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-01-31 -1.609627\n", "2012-02-29 -1.381380\n", "2012-03-31 1.065309\n", "2012-04-30 -0.192158\n", "2012-05-31 -0.742545\n", "Freq: M, dtype: float64" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2012', periods=5, freq='M')\n", "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n", "\n", "ts" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-01 -1.609627\n", "2012-02 -1.381380\n", "2012-03 1.065309\n", "2012-04 -0.192158\n", "2012-05 -0.742545\n", "Freq: M, dtype: float64" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps = ts.to_period()\n", "ps" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2012-01-01 -1.609627\n", "2012-02-01 -1.381380\n", "2012-03-01 1.065309\n", "2012-04-01 -0.192158\n", "2012-05-01 -0.742545\n", "Freq: MS, dtype: float64" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps.to_timestamp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Converting between period and timestamp enables some convenient arithmetic functions to be used. In the following example, we convert a quarterly frequency with year ending in November to 9am of the end of the month following the quarter end:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1990Q1 -0.583649\n", "1990Q2 0.855731\n", "1990Q3 -0.625833\n", "1990Q4 1.185059\n", "1991Q1 -0.317823\n", "Freq: Q-NOV, dtype: float64" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')\n", "ts = pd.Series(np.random.randn(len(prng)), prng)\n", "\n", "ts.head()" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1990-03-01 09:00 -0.583649\n", "1990-06-01 09:00 0.855731\n", "1990-09-01 09:00 -0.625833\n", "1990-12-01 09:00 1.185059\n", "1991-03-01 09:00 -0.317823\n", "Freq: H, dtype: float64" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9\n", "\n", "ts.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Categoricals" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": false }, "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", "
idraw_grade
01a
12b
23b
34a
45a
56e
\n", "
" ], "text/plain": [ " id raw_grade\n", "0 1 a\n", "1 2 b\n", "2 3 b\n", "3 4 a\n", "4 5 a\n", "5 6 e" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({\"id\":[1,2,3,4,5,6], \"raw_grade\":['a', 'b', 'b', 'a', 'a', 'e']})\n", "\n", "df" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "id int64\n", "raw_grade object\n", "dtype: object" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 b\n", "3 a\n", "4 a\n", "5 e\n", "Name: grade, dtype: category\n", "Categories (3, object): [a, b, e]" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"] = df[\"raw_grade\"].astype(\"category\")\n", "\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rename the categories to more meaningful names (assigning to Series.cat.categories is inplace!)" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "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", "
idraw_gradegrade
01avery good
12bgood
23bgood
34avery good
45avery good
56every bad
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "0 1 a very good\n", "1 2 b good\n", "2 3 b good\n", "3 4 a very good\n", "4 5 a very good\n", "5 6 e very bad" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"].cat.categories = [\"very good\", \"good\", \"very bad\"]\n", "\n", "df" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false }, "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", "
idraw_gradegrade
01avery good
12bgood
23bgood
34avery good
45avery good
56every bad
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "0 1 a very good\n", "1 2 b good\n", "2 3 b good\n", "3 4 a very good\n", "4 5 a very good\n", "5 6 e very bad" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Reorder the categories and simultaneously add the\n", "# missing categories (methods under Series .cat return a new Series per default).\n", "\n", "df[\"grade\"] = df[\"grade\"].cat.set_categories([\"very bad\", \"bad\", \"medium\", \"good\", \"very good\"])\n", "\n", "df" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "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", "
idraw_gradegrade
56every bad
12bgood
23bgood
01avery good
34avery good
45avery good
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "5 6 e very bad\n", "1 2 b good\n", "2 3 b good\n", "0 1 a very good\n", "3 4 a very good\n", "4 5 a very good" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Sorting is per order in the categories, not lexical order.\n", "df.sort_values(by=\"grade\")" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "grade\n", "very bad 1\n", "bad 0\n", "medium 0\n", "good 2\n", "very good 3\n", "dtype: int64" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Grouping by a categorical column shows also empty categories.\n", "df.groupby(\"grade\").size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plotting" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))\n", "\n", "ts = ts.cumsum()\n", "\n", "ts.plot()" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# On DataFrame, plot() is a convenience to plot all of the columns with labels:\n", "\n", "df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,\n", " columns=['A', 'B', 'C', 'D'])\n", "df = df.cumsum()\n", "\n", "df.plot(grid=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Data Read and Write " ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "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", "
ABCD
2000-01-010.3836240.4291010.7438081.577623
2000-01-02-0.6096800.4531511.4831890.865432
2000-01-03-0.6524630.1169402.300037-0.406062
2000-01-04-1.8041280.7035221.802338-0.694557
\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 0.383624 0.429101 0.743808 1.577623\n", "2000-01-02 -0.609680 0.453151 1.483189 0.865432\n", "2000-01-03 -0.652463 0.116940 2.300037 -0.406062\n", "2000-01-04 -1.804128 0.703522 1.802338 -0.694557" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[:4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "to_csv and read_csv" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# writing it to csv\n", "df.to_csv(\"dataset/df_as_csv.csv\")" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "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", "
Unnamed: 0ABCD
02000-01-010.3836240.4291010.7438081.577623
12000-01-02-0.6096800.4531511.4831890.865432
22000-01-03-0.6524630.1169402.300037-0.406062
32000-01-04-1.8041280.7035221.802338-0.694557
42000-01-05-3.5477750.9476401.720123-0.952502
\n", "
" ], "text/plain": [ " Unnamed: 0 A B C D\n", "0 2000-01-01 0.383624 0.429101 0.743808 1.577623\n", "1 2000-01-02 -0.609680 0.453151 1.483189 0.865432\n", "2 2000-01-03 -0.652463 0.116940 2.300037 -0.406062\n", "3 2000-01-04 -1.804128 0.703522 1.802338 -0.694557\n", "4 2000-01-05 -3.547775 0.947640 1.720123 -0.952502" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# reading it \n", "df2 = pd.read_csv(\"dataset/df_as_csv.csv\")\n", "df2.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for hdfs, to_hdf and read_hdf" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_hdf('foo.h5','df')" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "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", "
ABCD
2000-01-010.3836240.4291010.7438081.577623
2000-01-02-0.6096800.4531511.4831890.865432
2000-01-03-0.6524630.1169402.300037-0.406062
2000-01-04-1.8041280.7035221.802338-0.694557
2000-01-05-3.5477750.9476401.720123-0.952502
\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 0.383624 0.429101 0.743808 1.577623\n", "2000-01-02 -0.609680 0.453151 1.483189 0.865432\n", "2000-01-03 -0.652463 0.116940 2.300037 -0.406062\n", "2000-01-04 -1.804128 0.703522 1.802338 -0.694557\n", "2000-01-05 -3.547775 0.947640 1.720123 -0.952502" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_hdf('foo.h5','df').head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For Excel, to_excel and read_excel" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": true }, "outputs": [], "source": [ " df.to_excel('foo.xlsx', sheet_name='Sheet1')" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "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", "
ABCD
2000-01-010.3836240.4291010.7438081.577623
2000-01-02-0.6096800.4531511.4831890.865432
2000-01-03-0.6524630.1169402.300037-0.406062
2000-01-04-1.8041280.7035221.802338-0.694557
2000-01-05-3.5477750.9476401.720123-0.952502
\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 0.383624 0.429101 0.743808 1.577623\n", "2000-01-02 -0.609680 0.453151 1.483189 0.865432\n", "2000-01-03 -0.652463 0.116940 2.300037 -0.406062\n", "2000-01-04 -1.804128 0.703522 1.802338 -0.694557\n", "2000-01-05 -3.547775 0.947640 1.720123 -0.952502" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA']).head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "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": 1 }