Skip to content

Instantly share code, notes, and snippets.

@Immiora
Last active March 18, 2019 00:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Immiora/ae83e129466f2d496a790dff2666b35c to your computer and use it in GitHub Desktop.
Save Immiora/ae83e129466f2d496a790dff2666b35c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas basics\n",
"\n",
"* Series and Dataframe\n",
"* Indexing and data selection\n",
"* Loading and writing data\n",
"* Basic visualization \n",
"* Basic stats"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [],
"source": [
"# jupyter magics\n",
"%matplotlib inline\n",
"%config IPCompleter.greedy=True\n",
"\n",
"# multiple output\n",
"from IPython.core.interactiveshell import InteractiveShell\n",
"InteractiveShell.ast_node_interactivity = \"all\""
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from pandas import Series, DataFrame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas Series \n",
"Series is a mutable **1D** datatype in Pandas (any numpy datatype). Series uses explicit indices with Series datatype. Indices can be added automatically from 0 to len(data):"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]\n",
"RangeIndex(start=0, stop=5, step=1)\n",
"1.8675579901499675\n"
]
}
],
"source": [
"np.random.seed(0)\n",
"mySeries0 = Series(np.random.normal(size=(5,)))\n",
"print(mySeries0.values)\n",
"print(mySeries0.index)\n",
"print(mySeries0[mySeries0.last_valid_index()]) # -1 throws an error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or the index can be manually set:"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"code\n",
"a 1.624345\n",
"b -0.611756\n",
"c -0.528172\n",
"d -1.072969\n",
"e 0.865408\n",
"Name: random_norm, dtype: float64\n",
"\n",
"Values: [ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763]\n",
"Index: Index(['a', 'b', 'c', 'd', 'e'], dtype='object', name='code')\n",
"Element at index [\"a\"]: 1.6243453636632417\n"
]
}
],
"source": [
"np.random.seed(1)\n",
"mySeries1 = Series(np.random.normal(size=(5,)), index=['a', 'b', 'c', 'd', 'e'])\n",
"mySeries1.name = 'random_norm'\n",
"mySeries1.index.name = 'code'\n",
"print(mySeries1)\n",
"print()\n",
"print('Values: ', mySeries1.values)\n",
"print('Index: ', mySeries1.index)\n",
"print('Element at index [\"a\"]: ' + str(mySeries1['a']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All numpy operations can be applied to Series without losing the data structure. "
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"code\n",
"a 1.0\n",
"b -1.0\n",
"c -1.0\n",
"d -1.0\n",
"e 1.0\n",
"Name: random_norm, dtype: float64"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sign(mySeries1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Series are basically **ordered key-value pairs** and can be created directly from a Python dictionary."
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"s0 15\n",
"s1 22\n",
"s2 19\n",
"s3 32\n",
"Name: subjects, dtype: int64\n"
]
}
],
"source": [
"myDict = {'s0': 15, 's1': 22, 's2': 19, 's3': 32}\n",
"mySeries2 = Series(myDict, name='subjects')\n",
"print(mySeries2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas Dataframe\n",
"Dataframe is a mutable **2D** data type (=table). Dataframe is characterized by labels (for each column) and indices (for each row). Dataframe can have mixed data types in different columns.\n",
"\n",
"To display the data use **.head()** method."
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>codes</th>\n",
" <th>age</th>\n",
" <th>handedness</th>\n",
" <th>experiment</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>s0</th>\n",
" <td>sm</td>\n",
" <td>15</td>\n",
" <td>l</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s1</th>\n",
" <td>at</td>\n",
" <td>22</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s2</th>\n",
" <td>ap</td>\n",
" <td>19</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s3</th>\n",
" <td>gs</td>\n",
" <td>32</td>\n",
" <td>r</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s4</th>\n",
" <td>rd</td>\n",
" <td>28</td>\n",
" <td>r</td>\n",
" <td>AB</td>\n",
" <td>79</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" codes age handedness experiment performance\n",
"s0 sm 15 l AB 89\n",
"s1 at 22 l BA 78\n",
"s2 ap 19 l BA 95\n",
"s3 gs 32 r AB 89\n",
"s4 rd 28 r AB 79"
]
},
"execution_count": 136,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>codes</th>\n",
" <th>age</th>\n",
" <th>handedness</th>\n",
" <th>experiment</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>s0</th>\n",
" <td>sm</td>\n",
" <td>15</td>\n",
" <td>l</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s1</th>\n",
" <td>at</td>\n",
" <td>22</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s2</th>\n",
" <td>ap</td>\n",
" <td>19</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>95</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" codes age handedness experiment performance\n",
"s0 sm 15 l AB 89\n",
"s1 at 22 l BA 78\n",
"s2 ap 19 l BA 95"
]
},
"execution_count": 136,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"codes = ['sm', 'at', 'ap', 'gs', 'rd']\n",
"age = [15, 22, 19, 32, 28]\n",
"handedness = ['l', 'l', 'l', 'r', 'r']\n",
"experiment = ['AB', 'BA', 'BA', 'AB', 'AB']\n",
"performance = [89, 78, 95, 89, 79]\n",
"df = DataFrame({'codes': codes, 'age': age, 'handedness': handedness, 'experiment':experiment, 'performance':performance}, \n",
" index=['s0', 's1', 's2', 's3', 's4'])\n",
"df\n",
"df.head(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dataframe columns and index:"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Columns: Index(['codes', 'age', 'handedness', 'experiment', 'performance'], dtype='object')\n",
"Rows: Index(['s0', 's1', 's2', 's3', 's4'], dtype='object')\n"
]
}
],
"source": [
"print('Columns:', df.columns)\n",
"print('Rows:', df.index)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Indexing and data selection\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dataframe data can be indexed by column or by row. \n",
"However, indices can be **label-based** (`.loc`) or **position-based** (`.iloc`).\n",
"\n",
"If you index the entire row/column, the operation **returns a 1D Pandas Series**.\n",
"\n",
"Entire row by label:"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"codes sm\n",
"age 15\n",
"handedness l\n",
"experiment AB\n",
"performance 89\n",
"Name: s0, dtype: object"
]
},
"execution_count": 135,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# row by label\n",
"df.loc['s0']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Entire row by position:"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"codes sm\n",
"age 15\n",
"handedness l\n",
"experiment AB\n",
"performance 89\n",
"Name: s0, dtype: object"
]
},
"execution_count": 134,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# row by position\n",
"df.iloc[0]\n",
"# print(df.iloc[[0]]) returns a dataframe: using [[]] returns a DataFrame\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Entire column by label:"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"s0 15\n",
"s1 22\n",
"s2 19\n",
"s3 32\n",
"s4 28\n",
"Name: age, dtype: int64"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# column by label\n",
"df.loc[:, 'age']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Entire column by position:"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"s0 15\n",
"s1 22\n",
"s2 19\n",
"s3 32\n",
"s4 28\n",
"Name: age, dtype: int64"
]
},
"execution_count": 132,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# column by position\n",
"df.iloc[:, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Column data can also be accessed by using a dictionary-like or object-like syntax:\n",
"\n",
"**Note**: row data was previously acccessible by using `.ix[index]`, but it has now been deprecated in favor of `.loc` and `.iloc`"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Entire column [\"age\"]:\n"
]
},
{
"data": {
"text/plain": [
"s0 15\n",
"s1 22\n",
"s2 19\n",
"s3 32\n",
"s4 28\n",
"Name: age, dtype: int64"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"s0 15\n",
"s1 22\n",
"s2 19\n",
"s3 32\n",
"s4 28\n",
"Name: age, dtype: int64"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('Entire column [\"age\"]:')\n",
"df['age']\n",
"df.age"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Accessing single values is done by specifying both indices in `.loc` or `.iloc`:"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15\n",
"15\n"
]
}
],
"source": [
"print(df.loc['s0']['age'])\n",
"print(df.iloc[0][1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Often it is useful to select data based on a condition (**boolean indexing**):"
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>codes</th>\n",
" <th>age</th>\n",
" <th>handedness</th>\n",
" <th>experiment</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>s1</th>\n",
" <td>at</td>\n",
" <td>22</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s2</th>\n",
" <td>ap</td>\n",
" <td>19</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s3</th>\n",
" <td>gs</td>\n",
" <td>32</td>\n",
" <td>r</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s4</th>\n",
" <td>rd</td>\n",
" <td>28</td>\n",
" <td>r</td>\n",
" <td>AB</td>\n",
" <td>79</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" codes age handedness experiment performance\n",
"s1 at 22 l BA 78\n",
"s2 ap 19 l BA 95\n",
"s3 gs 32 r AB 89\n",
"s4 rd 28 r AB 79"
]
},
"execution_count": 145,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>codes</th>\n",
" <th>age</th>\n",
" <th>handedness</th>\n",
" <th>experiment</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>s2</th>\n",
" <td>ap</td>\n",
" <td>19</td>\n",
" <td>l</td>\n",
" <td>BA</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>s3</th>\n",
" <td>gs</td>\n",
" <td>32</td>\n",
" <td>r</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" codes age handedness experiment performance\n",
"s2 ap 19 l BA 95\n",
"s3 gs 32 r AB 89"
]
},
"execution_count": 145,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>codes</th>\n",
" <th>age</th>\n",
" <th>handedness</th>\n",
" <th>experiment</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>s0</th>\n",
" <td>sm</td>\n",
" <td>15</td>\n",
" <td>l</td>\n",
" <td>AB</td>\n",
" <td>89</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" codes age handedness experiment performance\n",
"s0 sm 15 l AB 89"
]
},
"execution_count": 145,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[df['age']>18] # dataframe\n",
"\n",
"df[(df['age']>18) & (df['performance']>80)] # dataframe\n",
"\n",
"df[((df['age']>30) & (df['performance']<80)) |((df['age']<18) & (df['performance']>80))] # dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading and writing data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read csv into a dataframe with `pd.ead_csv()`\n",
"\n",
"`pd.read_csv(\n",
" ['filepath_or_buffer', \"sep=','\", 'delimiter=None', \"header='infer'\", 'names=None', 'index_col=None', 'usecols=None', 'squeeze=False', 'prefix=None', 'mangle_dupe_cols=True', 'dtype=None', 'engine=None', 'converters=None', 'true_values=None', 'false_values=None', 'skipinitialspace=False', 'skiprows=None', 'skipfooter=0', 'nrows=None', 'na_values=None', 'keep_default_na=True', 'na_filter=True', 'verbose=False', 'skip_blank_lines=True', 'parse_dates=False', 'infer_datetime_format=False', 'keep_date_col=False', 'date_parser=None', 'dayfirst=False', 'iterator=False', 'chunksize=None', \"compression='infer'\", 'thousands=None', \"decimal=b'.'\", 'lineterminator=None', 'quotechar=\\'\"\\'', 'quoting=0', 'doublequote=True', 'escapechar=None', 'comment=None', 'encoding=None', 'dialect=None', 'tupleize_cols=None', 'error_bad_lines=True', 'warn_bad_lines=True', 'delim_whitespace=False', 'low_memory=True', 'memory_map=False', 'float_precision=None']`\n",
" \n",
"`pd.ead_csv()` can load a local `.csv` file or the one from the specified URL.\n",
"\n",
"**Some available csv datasets:**\n",
"\n",
"* Seaborn has a number of available sample datasets: [here](https://github.com/mwaskom/seaborn-data)\n",
"* Some sample datasets are available from R package: [here](https://vincentarelbundock.github.io/Rdatasets/datasets.html)\n",
"* Kaggle is a great source of datasets for solving machine learning problems: [here](https://www.kaggle.com/datasets)"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>subject</th>\n",
" <th>timepoint</th>\n",
" <th>event</th>\n",
" <th>region</th>\n",
" <th>signal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>s13</td>\n",
" <td>18</td>\n",
" <td>stim</td>\n",
" <td>parietal</td>\n",
" <td>-0.017552</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>s5</td>\n",
" <td>14</td>\n",
" <td>stim</td>\n",
" <td>parietal</td>\n",
" <td>-0.080883</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>s12</td>\n",
" <td>18</td>\n",
" <td>stim</td>\n",
" <td>parietal</td>\n",
" <td>-0.081033</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>s11</td>\n",
" <td>18</td>\n",
" <td>stim</td>\n",
" <td>parietal</td>\n",
" <td>-0.046134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>s10</td>\n",
" <td>18</td>\n",
" <td>stim</td>\n",
" <td>parietal</td>\n",
" <td>-0.037970</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" subject timepoint event region signal\n",
"0 s13 18 stim parietal -0.017552\n",
"1 s5 14 stim parietal -0.080883\n",
"2 s12 18 stim parietal -0.081033\n",
"3 s11 18 stim parietal -0.046134\n",
"4 s10 18 stim parietal -0.037970"
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/fmri.csv')\n",
"csv_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['subject', 'timepoint', 'event', 'region', 'signal'], dtype='object')"
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [],
"source": [
"csv_df_subset10 = csv_df[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Write dataframe into `.csv`, `.txt`, `.pickle` or `.xls`\n",
"\n",
"`pd.to_csv(\n",
" ['path_or_buf=None', \"sep=','\", \"na_rep=''\", 'float_format=None', 'columns=None', 'header=True', 'index=True', 'index_label=None', \"mode='w'\", 'encoding=None', \"compression='infer'\", 'quoting=None', 'quotechar=\\'\"\\'', 'line_terminator=None', 'chunksize=None', 'tupleize_cols=None', 'date_format=None', 'doublequote=True', 'escapechar=None', \"decimal='.'\"]`"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [],
"source": [
"csv_df_subset10.to_csv('./temp_fmri_subset10.csv')\n",
"# csv_df_subset10.to_csv('./temp_fmri_subset10.txt')\n",
"# csv_df_subset10.to_excel('./temp_fmri_subset10.xls')\n",
"# csv_df_subset10.to_pickle('./temp_fmri_subset10')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic preprocessing and analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Show all data type in the dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"subject object\n",
"timepoint int64\n",
"event object\n",
"region object\n",
"signal float64\n",
"dtype: object"
]
},
"execution_count": 166,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Display the columns in the data:"
]
},
{
"cell_type": "code",
"execution_count": 162,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['subject', 'timepoint', 'event', 'region', 'signal'], dtype='object')"
]
},
"execution_count": 162,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df.columns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Find **unique values** in `['subject']`, `['event']` and `['region']`:"
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['s13', 's5', 's12', 's11', 's10', 's9', 's8', 's7', 's6', 's4',\n",
" 's3', 's2', 's1', 's0'], dtype=object)"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"array(['stim', 'cue'], dtype=object)"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"array(['parietal', 'frontal'], dtype=object)"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df['subject'].unique()\n",
"csv_df['event'].unique()\n",
"csv_df['region'].unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Access data based on coditions in other columns:"
]
},
{
"cell_type": "code",
"execution_count": 181,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"13 stim\n",
"83 stim\n",
"138 stim\n",
"210 stim\n",
"284 stim\n",
"350 stim\n",
"420 stim\n",
"489 stim\n",
"574 cue\n",
"649 cue\n",
"720 cue\n",
"782 cue\n",
"853 cue\n",
"923 cue\n",
"979 cue\n",
"1058 cue\n",
"Name: event, dtype: object"
]
},
"execution_count": 181,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df['event'][csv_df['subject']=='s1'][::5] # subsample output every 5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Categorical values can easily ba mapped to dummy variables using `.map()`. \n",
"#### You can also use `.apply()` and a custom-made function to define a transformation to apply to a column of a dataframe"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"outputs": [],
"source": [
"csv_df['event'] = csv_df['event'].map({'cue': 0, 'stim': 1})"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"75 1\n",
"150 1\n",
"225 1\n",
"300 1\n",
"375 1\n",
"450 1\n",
"525 1\n",
"600 0\n",
"675 0\n",
"750 0\n",
"825 0\n",
"900 0\n",
"975 0\n",
"1050 0\n",
"Name: event, dtype: int64"
]
},
"execution_count": 193,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df['event'][::75] # subsample output every 75"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Subselect data and sort\n",
"\n",
"* Below we want to select all fmri `signal` data from `subject == s1` during `event == 1` (stim) in `region == frontal`. \n",
"* We will ouput the signal values together with the corresponding `timepoint` values.\n",
"* Finally we will sort the data by the `timepoint` value."
]
},
{
"cell_type": "code",
"execution_count": 207,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timepoint</th>\n",
" <th>signal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>284</th>\n",
" <td>0</td>\n",
" <td>-0.046049</td>\n",
" </tr>\n",
" <tr>\n",
" <th>281</th>\n",
" <td>1</td>\n",
" <td>-0.060273</td>\n",
" </tr>\n",
" <tr>\n",
" <th>295</th>\n",
" <td>2</td>\n",
" <td>-0.037520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>309</th>\n",
" <td>3</td>\n",
" <td>0.057598</td>\n",
" </tr>\n",
" <tr>\n",
" <th>323</th>\n",
" <td>4</td>\n",
" <td>0.202123</td>\n",
" </tr>\n",
" <tr>\n",
" <th>336</th>\n",
" <td>5</td>\n",
" <td>0.315860</td>\n",
" </tr>\n",
" <tr>\n",
" <th>350</th>\n",
" <td>6</td>\n",
" <td>0.321335</td>\n",
" </tr>\n",
" <tr>\n",
" <th>364</th>\n",
" <td>7</td>\n",
" <td>0.204943</td>\n",
" </tr>\n",
" <tr>\n",
" <th>378</th>\n",
" <td>8</td>\n",
" <td>0.036685</td>\n",
" </tr>\n",
" <tr>\n",
" <th>392</th>\n",
" <td>9</td>\n",
" <td>-0.092768</td>\n",
" </tr>\n",
" <tr>\n",
" <th>406</th>\n",
" <td>10</td>\n",
" <td>-0.143302</td>\n",
" </tr>\n",
" <tr>\n",
" <th>420</th>\n",
" <td>11</td>\n",
" <td>-0.133647</td>\n",
" </tr>\n",
" <tr>\n",
" <th>434</th>\n",
" <td>12</td>\n",
" <td>-0.093411</td>\n",
" </tr>\n",
" <tr>\n",
" <th>449</th>\n",
" <td>13</td>\n",
" <td>-0.052714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>463</th>\n",
" <td>14</td>\n",
" <td>-0.021003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>476</th>\n",
" <td>15</td>\n",
" <td>-0.005134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>489</th>\n",
" <td>16</td>\n",
" <td>-0.002719</td>\n",
" </tr>\n",
" <tr>\n",
" <th>520</th>\n",
" <td>17</td>\n",
" <td>-0.015686</td>\n",
" </tr>\n",
" <tr>\n",
" <th>516</th>\n",
" <td>18</td>\n",
" <td>-0.035852</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timepoint signal\n",
"284 0 -0.046049\n",
"281 1 -0.060273\n",
"295 2 -0.037520\n",
"309 3 0.057598\n",
"323 4 0.202123\n",
"336 5 0.315860\n",
"350 6 0.321335\n",
"364 7 0.204943\n",
"378 8 0.036685\n",
"392 9 -0.092768\n",
"406 10 -0.143302\n",
"420 11 -0.133647\n",
"434 12 -0.093411\n",
"449 13 -0.052714\n",
"463 14 -0.021003\n",
"476 15 -0.005134\n",
"489 16 -0.002719\n",
"520 17 -0.015686\n",
"516 18 -0.035852"
]
},
"execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df[['timepoint', 'signal']][(csv_df['subject']=='s1') & (csv_df['event']==1) & (csv_df['region']=='frontal')].sort_values(by='timepoint')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### This output can be saved as a `np.array` and be processed further on separately:"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {},
"outputs": [],
"source": [
"data0 = csv_df[['timepoint', 'signal']][(csv_df['subject']=='s1') & (csv_df['event']==1) & (csv_df['region']=='frontal')].sort_values(by='timepoint').values[:, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Basic descriptive statistics about the dataframe can ba accessed by calling `df.describe()`. Only valid for numerical dtype columns"
]
},
{
"cell_type": "code",
"execution_count": 223,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timepoint</th>\n",
" <th>event</th>\n",
" <th>signal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1064.000000</td>\n",
" <td>1064.000000</td>\n",
" <td>1064.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>9.000000</td>\n",
" <td>0.500000</td>\n",
" <td>0.003540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>5.479801</td>\n",
" <td>0.500235</td>\n",
" <td>0.093930</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-0.255486</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>4.000000</td>\n",
" <td>0.000000</td>\n",
" <td>-0.046070</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>9.000000</td>\n",
" <td>0.500000</td>\n",
" <td>-0.013653</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>14.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.024293</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>18.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.564985</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timepoint event signal\n",
"count 1064.000000 1064.000000 1064.000000\n",
"mean 9.000000 0.500000 0.003540\n",
"std 5.479801 0.500235 0.093930\n",
"min 0.000000 0.000000 -0.255486\n",
"25% 4.000000 0.000000 -0.046070\n",
"50% 9.000000 0.500000 -0.013653\n",
"75% 14.000000 1.000000 0.024293\n",
"max 18.000000 1.000000 0.564985"
]
},
"execution_count": 223,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Basic operations can be run on column data as well as the entire dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 245,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"subject s13s5s12s11s10s9s8s7s6s5s4s3s2s1s0s13s12s7s10s...\n",
"timepoint 9576\n",
"event 532\n",
"region parietalparietalparietalparietalparietalpariet...\n",
"signal 3.76631\n",
"dtype: object"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"0.0035397685640969675"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"3.7663137521991734"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>signal</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>signal</th>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" signal\n",
"signal 1.0"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_df.sum()\n",
"\n",
"csv_df['signal'].mean()\n",
"csv_df['signal'].sum()\n",
"\n",
"csv_df[['signal']][(csv_df['timepoint']==10) & (csv_df['event']==1) & (csv_df['region']=='frontal')].corr()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic visualization\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Histofram of data can be plotted using `.hist()`:"
]
},
{
"cell_type": "code",
"execution_count": 247,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"csv_df['signal'].hist();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Categorical data can be easily plotted using `.value_counts()` (it counts unique values). Below is a histogram over the subjects"
]
},
{
"cell_type": "code",
"execution_count": 173,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"csv_df['subject'].value_counts().plot(kind='bar');"
]
},
{
"cell_type": "code",
"execution_count": 241,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"csv_df[['signal']][(csv_df['timepoint']==10) & (csv_df['event']==1) & (csv_df['region']=='frontal')].plot();\n",
"csv_df[['signal']][(csv_df['timepoint']==9) & (csv_df['event']==1) & (csv_df['region']=='frontal')].plot();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercises"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 1. Find all data that belongs to `['subject'] == s1`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2. Turn `['region']` to a dummy variable"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3. Plot mean of signal of all subjects over 18 time points, during stimulation of parietal region "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4. Find mean and std of signal over subjects for all timepoints during stimulation vs cue in frontal reigon"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 5. Plot bars for means of signal over all time points during stimulation in parietal and frontal regions for subejct 5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.2"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment