{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "*New in version 0.17.1*\n", "\n", "

*Provisional: This is a new feature and still under development. We'll be adding features and possibly making breaking changes in future releases. We'd love to hear your [feedback](https://github.com/pydata/pandas/issues).*

\n", "\n", "This document is written as a Jupyter Notebook, and can be viewed or downloaded [here](http://nbviewer.ipython.org/github/pydata/pandas/blob/master/doc/source/html-styling.ipynb).\n", "\n", "You can apply **conditional formatting**, the visual styling of a DataFrame\n", "depending on the data within, by using the ``DataFrame.style`` property.\n", "This is a property that returns a ``pandas.Styler`` object, which has\n", "useful methods for formatting and displaying DataFrames.\n", "\n", "The styling is accomplished using CSS.\n", "You write \"style functions\" that take scalars, `DataFrame`s or `Series`, and return *like-indexed* DataFrames or Series with CSS `\"attribute: value\"` pairs for the values.\n", "These functions can be incrementally passed to the `Styler` which collects the styles before rendering.\n", "\n", "### Contents\n", "\n", "- [Building Styles](#Building-Styles)\n", "- [Finer Control: Slicing](#Finer-Control:-Slicing)\n", "- [Builtin Styles](#Builtin-Styles)\n", "- [Other options](#Other-options)\n", "- [Sharing Styles](#Sharing-Styles)\n", "- [Limitations](#Limitations)\n", "- [Terms](#Terms)\n", "- [Extensibility](#Extensibility)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Building Styles\n", "\n", "Pass your style functions into one of the following methods:\n", "\n", "- `Styler.applymap`: elementwise\n", "- `Styler.apply`: column-/row-/table-wise\n", "\n", "Both of those methods take a function (and some other keyword arguments) and applies your function to the DataFrame in a certain way.\n", "`Styler.applymap` works through the DataFrame elementwise.\n", "`Styler.apply` passes each column or row into your DataFrame one-at-a-time or the entire table at once, depending on the `axis` keyword argument.\n", "For columnwise use `axis=0`, rowwise use `axis=1`, and for the entire table at once use `axis=None`.\n", "\n", "The result of the function application, a CSS attribute-value pair, is stored in an internal dictionary on your ``Styler`` object.\n", "\n", "Let's see some examples." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "np.random.seed(24)\n", "df = pd.DataFrame({'A': np.linspace(1, 10, 10)})\n", "df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))],\n", " axis=1)\n", "df.iloc[0, 2] = np.nan" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's a boring example of rendering a DataFrame, without any (visible) styles:" ] }, { "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", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note*: The `DataFrame.style` attribute is a propetry that returns a `Styler` object. `Styler` has a `_repr_html_` method defined on it so they are rendered automatically. If you want the actual HTML back for further processing or for writing to file call the `.render()` method which returns a string.\n", "\n", "The above output looks very similar to the standard DataFrame HTML representation. But we've done some work behind the scenes to attach CSS classes to each cell. We can view these by calling the `.render` method." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['',\n", " ' \n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = df.style.applymap(color_negative_red)\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice the similarity with the standard `df.applymap`, which operates on DataFrames elementwise. We want you to be able to resuse your existing knowledge of how to interact with DataFrames.\n", "\n", "Notice also that our function returned a string containing the CSS attribute and value, separated by a colon just like in a `\n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.apply(highlight_max)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We encourage you to use method chains to build up a style piecewise, before finally rending at the end of the chain." ] }, { "cell_type": "code", "execution_count": 10, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.\\\n", " applymap(color_negative_red).\\\n", " apply(highlight_max)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above we used `Styler.apply` to pass in each column one at a time.\n", "\n", "

*Debugging Tip*: If you're having trouble writing your style function, try just passing it into DataFrame.apply. Internally, Styler.apply uses DataFrame.apply so the result should be the same.

\n", "\n", "What if you wanted to highlight just the maximum value in the entire table?\n", "Use `.apply(function, axis=None)` to indicate that your function wants the entire table, not one column or row at a time. Let's try that next.\n", "\n", "We'll rewrite our `highlight-max` to handle either Series (from `.apply(axis=0 or 1)`) or DataFrames (from `.apply(axis=None)`). We'll also allow the color to be adjustable, to demonstrate that `.apply`, and `.applymap` pass along keyword arguments." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def highlight_max(data, color='yellow'):\n", " '''\n", " highlight the maximum in a Series or DataFrame\n", " '''\n", " attr = 'background-color: {}'.format(color)\n", " if data.ndim == 1: # Series from .apply(axis=0) or axis=1\n", " is_max = data == data.max()\n", " return [attr if v else '' for v in is_max]\n", " else: # from .apply(axis=None)\n", " is_max = data == data.max().max()\n", " return pd.DataFrame(np.where(is_max, attr, ''),\n", " index=data.index, columns=data.columns)" ] }, { "cell_type": "code", "execution_count": 12, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.apply(highlight_max, color='darkorange', axis=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Building Styles Summary\n", "\n", "Style functions should return strings with one or more CSS `attribute: value` delimited by semicolons. Use\n", "\n", "- `Styler.applymap(func)` for elementwise styles\n", "- `Styler.apply(func, axis=0)` for columnwise styles\n", "- `Styler.apply(func, axis=1)` for rowwise styles\n", "- `Styler.apply(func, axis=None)` for tablewise styles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Finer Control: Slicing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both `Styler.apply`, and `Styler.applymap` accept a `subset` keyword.\n", "This allows you to apply styles to specific rows or columns, without having to code that logic into your `style` function.\n", "\n", "The value passed to `subset` behaves simlar to slicing a DataFrame.\n", "\n", "- A scalar is treated as a column label\n", "- A list (or series or numpy array)\n", "- A tuple is treated as `(row_indexer, column_indexer)`\n", "\n", "Consider using `pd.IndexSlice` to construct the tuple for the last one." ] }, { "cell_type": "code", "execution_count": 13, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.apply(highlight_max, subset=['B', 'C', 'D'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For row and column slicing, any valid indexer to `.loc` will work." ] }, { "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.applymap(color_negative_red,\n", " subset=pd.IndexSlice[2:5, ['B', 'D']])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Only label-based slicing is supported right now, not positional.\n", "\n", "If your style function uses a `subset` or `axis` keyword argument, consider wrapping your function in a `functools.partial`, partialing out that keyword.\n", "\n", "```python\n", "my_func2 = functools.partial(my_func, subset=42)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Builtin Styles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we expect certain styling functions to be common enough that we've included a few \"built-in\" to the `Styler`, so you don't have to write them yourself." ] }, { "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", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.highlight_null(null_color='red')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can create \"heatmaps\" with the `background_gradient` method. These require matplotlib, and we'll use [Seaborn](http://stanford.edu/~mwaskom/software/seaborn/) to get a nice colormap." ] }, { "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", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import seaborn as sns\n", "\n", "cm = sns.light_palette(\"green\", as_cmap=True)\n", "\n", "s = df.style.background_gradient(cmap=cm)\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Styler.background_gradient` takes the keyword arguments `low` and `high`. Roughly speaking these extend the range of your data by `low` and `high` percent so that when we convert the colors, the colormap's entire range isn't used. This is useful so that you can actually read the text still." ] }, { "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Uses the full color range\n", "df.loc[:4].style.background_gradient(cmap='viridis')" ] }, { "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Compreess the color range\n", "(df.loc[:4]\n", " .style\n", " .background_gradient(cmap='viridis', low=.5, high=0)\n", " .highlight_null('red'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can include \"bar charts\" in your DataFrame." ] }, { "cell_type": "code", "execution_count": 19, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.bar(subset=['A', 'B'], color='#d65f5f')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's also `.highlight_min` and `.highlight_max`." ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.highlight_max(axis=0)" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.highlight_min(axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `Styler.set_properties` when the style doesn't actually depend on the values." ] }, { "cell_type": "code", "execution_count": 22, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.set_properties(**{'background-color': 'black',\n", " 'color': 'lawngreen',\n", " 'border-color': 'white'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sharing Styles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Say you have a lovely style built up for a DataFrame, and now you want to apply the same style to a second DataFrame. Export the style with `df1.style.export`, and import it on the second DataFrame with `df1.style.set`" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = -df\n", "style1 = df.style.applymap(color_negative_red)\n", "style1" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " -1.0\n", " \n", " \n", " \n", " \n", " -1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " 0.31628\n", " \n", " \n", " \n", " \n", " 0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " -2.0\n", " \n", " \n", " \n", " \n", " 1.070816\n", " \n", " \n", " \n", " \n", " 1.438713\n", " \n", " \n", " \n", " \n", " -0.564417\n", " \n", " \n", " \n", " \n", " -0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " -3.0\n", " \n", " \n", " \n", " \n", " 1.626404\n", " \n", " \n", " \n", " \n", " -0.219565\n", " \n", " \n", " \n", " \n", " -0.678805\n", " \n", " \n", " \n", " \n", " -1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " -4.0\n", " \n", " \n", " \n", " \n", " -0.961538\n", " \n", " \n", " \n", " \n", " -0.104011\n", " \n", " \n", " \n", " \n", " 0.481165\n", " \n", " \n", " \n", " \n", " -0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " -5.0\n", " \n", " \n", " \n", " \n", " -1.453425\n", " \n", " \n", " \n", " \n", " -1.057737\n", " \n", " \n", " \n", " \n", " -0.165562\n", " \n", " \n", " \n", " \n", " -0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " -6.0\n", " \n", " \n", " \n", " \n", " 1.336936\n", " \n", " \n", " \n", " \n", " -0.562861\n", " \n", " \n", " \n", " \n", " -1.392855\n", " \n", " \n", " \n", " \n", " 0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " -7.0\n", " \n", " \n", " \n", " \n", " -0.121668\n", " \n", " \n", " \n", " \n", " -1.207603\n", " \n", " \n", " \n", " \n", " 0.00204\n", " \n", " \n", " \n", " \n", " -1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " -8.0\n", " \n", " \n", " \n", " \n", " -0.354493\n", " \n", " \n", " \n", " \n", " -1.037528\n", " \n", " \n", " \n", " \n", " 0.385684\n", " \n", " \n", " \n", " \n", " -0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " -9.0\n", " \n", " \n", " \n", " \n", " -1.686583\n", " \n", " \n", " \n", " \n", " 1.325963\n", " \n", " \n", " \n", " \n", " -1.428984\n", " \n", " \n", " \n", " \n", " 2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " -10.0\n", " \n", " \n", " \n", " \n", " 0.12982\n", " \n", " \n", " \n", " \n", " -0.631523\n", " \n", " \n", " \n", " \n", " 0.586538\n", " \n", " \n", " \n", " \n", " -0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "style2 = df2.style\n", "style2.use(style1.export())\n", "style2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that you're able share the styles even though they're data aware. The styles are re-evaluated on the new DataFrame they've been `use`d upon." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Other options\n", "\n", "You've seen a few methods for data-driven styling.\n", "`Styler` also provides a few other options for styles that don't depend on the data.\n", "\n", "- precision\n", "- captions\n", "- table-wide styles\n", "\n", "Each of these can be specified in two ways:\n", "\n", "- A keyword argument to `pandas.core.Styler`\n", "- A call to one of the `.set_` methods, e.g. `.set_caption`\n", "\n", "The best method to use depends on the context. Use the `Styler` constructor when building many styled DataFrames that should all share the same properties. For interactive use, the`.set_` methods are more convenient." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Precision" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can control the precision of floats using pandas' regular `display.precision` option." ] }, { "cell_type": "code", "execution_count": 25, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.33\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.32\n", " \n", " \n", " \n", " \n", " -0.99\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.07\n", " \n", " \n", " \n", " \n", " -1.44\n", " \n", " \n", " \n", " \n", " 0.56\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.63\n", " \n", " \n", " \n", " \n", " 0.22\n", " \n", " \n", " \n", " \n", " 0.68\n", " \n", " \n", " \n", " \n", " 1.89\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.96\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " -0.48\n", " \n", " \n", " \n", " \n", " 0.85\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.45\n", " \n", " \n", " \n", " \n", " 1.06\n", " \n", " \n", " \n", " \n", " 0.17\n", " \n", " \n", " \n", " \n", " 0.52\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.34\n", " \n", " \n", " \n", " \n", " 0.56\n", " \n", " \n", " \n", " \n", " 1.39\n", " \n", " \n", " \n", " \n", " -0.06\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.12\n", " \n", " \n", " \n", " \n", " 1.21\n", " \n", " \n", " \n", " \n", " -0.0\n", " \n", " \n", " \n", " \n", " 1.63\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.35\n", " \n", " \n", " \n", " \n", " 1.04\n", " \n", " \n", " \n", " \n", " -0.39\n", " \n", " \n", " \n", " \n", " 0.52\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.69\n", " \n", " \n", " \n", " \n", " -1.33\n", " \n", " \n", " \n", " \n", " 1.43\n", " \n", " \n", " \n", " \n", " -2.09\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.13\n", " \n", " \n", " \n", " \n", " 0.63\n", " \n", " \n", " \n", " \n", " -0.59\n", " \n", " \n", " \n", " \n", " 0.29\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with pd.option_context('display.precision', 2):\n", " html = (df.style\n", " .applymap(color_negative_red)\n", " .apply(highlight_max))\n", "html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or through a `set_precision` method." ] }, { "cell_type": "code", "execution_count": 26, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.33\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.32\n", " \n", " \n", " \n", " \n", " -0.99\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.07\n", " \n", " \n", " \n", " \n", " -1.44\n", " \n", " \n", " \n", " \n", " 0.56\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.63\n", " \n", " \n", " \n", " \n", " 0.22\n", " \n", " \n", " \n", " \n", " 0.68\n", " \n", " \n", " \n", " \n", " 1.89\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.96\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " -0.48\n", " \n", " \n", " \n", " \n", " 0.85\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.45\n", " \n", " \n", " \n", " \n", " 1.06\n", " \n", " \n", " \n", " \n", " 0.17\n", " \n", " \n", " \n", " \n", " 0.52\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.34\n", " \n", " \n", " \n", " \n", " 0.56\n", " \n", " \n", " \n", " \n", " 1.39\n", " \n", " \n", " \n", " \n", " -0.06\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.12\n", " \n", " \n", " \n", " \n", " 1.21\n", " \n", " \n", " \n", " \n", " -0.0\n", " \n", " \n", " \n", " \n", " 1.63\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.35\n", " \n", " \n", " \n", " \n", " 1.04\n", " \n", " \n", " \n", " \n", " -0.39\n", " \n", " \n", " \n", " \n", " 0.52\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.69\n", " \n", " \n", " \n", " \n", " -1.33\n", " \n", " \n", " \n", " \n", " 1.43\n", " \n", " \n", " \n", " \n", " -2.09\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.13\n", " \n", " \n", " \n", " \n", " 0.63\n", " \n", " \n", " \n", " \n", " -0.59\n", " \n", " \n", " \n", " \n", " 0.29\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style\\\n", " .applymap(color_negative_red)\\\n", " .apply(highlight_max)\\\n", " .set_precision(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting the precision only affects the printed number; the full-precision values are always passed to your style functions. You can always use `df.round(2).style` if you'd prefer to round from the start." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Captions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regular table captions can be added in a few ways." ] }, { "cell_type": "code", "execution_count": 27, "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", "
Colormaps, with a caption.
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.style.set_caption('Colormaps, with a caption.')\\\n", " .background_gradient(cmap=cm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Table Styles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next option you have are \"table styles\".\n", "These are styles that apply to the table as a whole, but don't look at the data.\n", "Certain sytlings, including pseudo-selectors like `:hover` can only be used this way." ] }, { "cell_type": "code", "execution_count": 28, "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", "
Hover to highlight.
\n", " \n", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "\n", "def hover(hover_color=\"#ffff99\"):\n", " return dict(selector=\"tr:hover\",\n", " props=[(\"background-color\", \"%s\" % hover_color)])\n", "\n", "styles = [\n", " hover(),\n", " dict(selector=\"th\", props=[(\"font-size\", \"150%\"),\n", " (\"text-align\", \"center\")]),\n", " dict(selector=\"caption\", props=[(\"caption-side\", \"bottom\")])\n", "]\n", "html = (df.style.set_table_styles(styles)\n", " .set_caption(\"Hover to highlight.\"))\n", "html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`table_styles` should be a list of dictionaries.\n", "Each dictionary should have the `selector` and `props` keys.\n", "The value for `selector` should be a valid CSS selector.\n", "Recall that all the styles are already attached to an `id`, unique to\n", "each `Styler`. This selector is in addition to that `id`.\n", "The value for `props` should be a list of tuples of `('attribute', 'value')`.\n", "\n", "`table_styles` are extremely flexible, but not as fun to type out by hand.\n", "We hope to collect some useful ones either in pandas, or preferable in a new package that [builds on top](#Extensibility) the tools here." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Limitations\n", "\n", "- DataFrame only `(use Series.to_frame().style)`\n", "- The index and columns must be unique\n", "- No large repr, and performance isn't great; this is intended for summary DataFrames\n", "- You can only style the *values*, not the index or columns\n", "- You can only apply styles, you can't insert new HTML entities\n", "\n", "Some of these will be addressed in the future.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Terms\n", "\n", "- Style function: a function that's passed into `Styler.apply` or `Styler.applymap` and returns values like `'css attribute: value'`\n", "- Builtin style functions: style functions that are methods on `Styler`\n", "- table style: a dictionary with the two keys `selector` and `props`. `selector` is the CSS selector that `props` will apply to. `props` is a list of `(attribute, value)` tuples. A list of table styles passed into `Styler`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fun stuff\n", "\n", "Here are a few interesting examples.\n", "\n", "`Styler` interacts pretty well with widgets. If you're viewing this online instead of running the notebook yourself, you're missing out on interactively adjusting the color palette." ] }, { "cell_type": "code", "execution_count": 29, "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", " A\n", " \n", " B\n", " \n", " C\n", " \n", " D\n", " \n", " E\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " 1.329212\n", " \n", " \n", " \n", " \n", " nan\n", " \n", " \n", " \n", " \n", " -0.31628\n", " \n", " \n", " \n", " \n", " -0.99081\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " 2.0\n", " \n", " \n", " \n", " \n", " -1.070816\n", " \n", " \n", " \n", " \n", " -1.438713\n", " \n", " \n", " \n", " \n", " 0.564417\n", " \n", " \n", " \n", " \n", " 0.295722\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " -1.626404\n", " \n", " \n", " \n", " \n", " 0.219565\n", " \n", " \n", " \n", " \n", " 0.678805\n", " \n", " \n", " \n", " \n", " 1.889273\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " 4.0\n", " \n", " \n", " \n", " \n", " 0.961538\n", " \n", " \n", " \n", " \n", " 0.104011\n", " \n", " \n", " \n", " \n", " -0.481165\n", " \n", " \n", " \n", " \n", " 0.850229\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " 5.0\n", " \n", " \n", " \n", " \n", " 1.453425\n", " \n", " \n", " \n", " \n", " 1.057737\n", " \n", " \n", " \n", " \n", " 0.165562\n", " \n", " \n", " \n", " \n", " 0.515018\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 6.0\n", " \n", " \n", " \n", " \n", " -1.336936\n", " \n", " \n", " \n", " \n", " 0.562861\n", " \n", " \n", " \n", " \n", " 1.392855\n", " \n", " \n", " \n", " \n", " -0.063328\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " 7.0\n", " \n", " \n", " \n", " \n", " 0.121668\n", " \n", " \n", " \n", " \n", " 1.207603\n", " \n", " \n", " \n", " \n", " -0.00204\n", " \n", " \n", " \n", " \n", " 1.627796\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " 8.0\n", " \n", " \n", " \n", " \n", " 0.354493\n", " \n", " \n", " \n", " \n", " 1.037528\n", " \n", " \n", " \n", " \n", " -0.385684\n", " \n", " \n", " \n", " \n", " 0.519818\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 9.0\n", " \n", " \n", " \n", " \n", " 1.686583\n", " \n", " \n", " \n", " \n", " -1.325963\n", " \n", " \n", " \n", " \n", " 1.428984\n", " \n", " \n", " \n", " \n", " -2.089354\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 10.0\n", " \n", " \n", " \n", " \n", " -0.12982\n", " \n", " \n", " \n", " \n", " 0.631523\n", " \n", " \n", " \n", " \n", " -0.586538\n", " \n", " \n", " \n", " \n", " 0.29072\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.html import widgets\n", "@widgets.interact\n", "def f(h_neg=(0, 359, 1), h_pos=(0, 359), s=(0., 99.9), l=(0., 99.9)):\n", " return df.style.background_gradient(\n", " cmap=sns.palettes.diverging_palette(h_neg=h_neg, h_pos=h_pos, s=s, l=l,\n", " as_cmap=True)\n", " )" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def magnify():\n", " return [dict(selector=\"th\",\n", " props=[(\"font-size\", \"4pt\")]),\n", " dict(selector=\"td\",\n", " props=[('padding', \"0em 0em\")]),\n", " dict(selector=\"th:hover\",\n", " props=[(\"font-size\", \"12pt\")]),\n", " dict(selector=\"tr:hover td:hover\",\n", " props=[('max-width', '200px'),\n", " ('font-size', '12pt')])\n", "]" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Hover to magify
\n", " \n", " 0\n", " \n", " 1\n", " \n", " 2\n", " \n", " 3\n", " \n", " 4\n", " \n", " 5\n", " \n", " 6\n", " \n", " 7\n", " \n", " 8\n", " \n", " 9\n", " \n", " 10\n", " \n", " 11\n", " \n", " 12\n", " \n", " 13\n", " \n", " 14\n", " \n", " 15\n", " \n", " 16\n", " \n", " 17\n", " \n", " 18\n", " \n", " 19\n", " \n", " 20\n", " \n", " 21\n", " \n", " 22\n", " \n", " 23\n", " \n", " 24\n", " \n", "
\n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 0.23\n", " \n", " \n", " \n", " \n", " 1.03\n", " \n", " \n", " \n", " \n", " -0.84\n", " \n", " \n", " \n", " \n", " -0.59\n", " \n", " \n", " \n", " \n", " -0.96\n", " \n", " \n", " \n", " \n", " -0.22\n", " \n", " \n", " \n", " \n", " -0.62\n", " \n", " \n", " \n", " \n", " 1.84\n", " \n", " \n", " \n", " \n", " -2.05\n", " \n", " \n", " \n", " \n", " 0.87\n", " \n", " \n", " \n", " \n", " -0.92\n", " \n", " \n", " \n", " \n", " -0.23\n", " \n", " \n", " \n", " \n", " 2.15\n", " \n", " \n", " \n", " \n", " -1.33\n", " \n", " \n", " \n", " \n", " 0.08\n", " \n", " \n", " \n", " \n", " -1.25\n", " \n", " \n", " \n", " \n", " 1.2\n", " \n", " \n", " \n", " \n", " -1.05\n", " \n", " \n", " \n", " \n", " 1.06\n", " \n", " \n", " \n", " \n", " -0.42\n", " \n", " \n", " \n", " \n", " 2.29\n", " \n", " \n", " \n", " \n", " -2.59\n", " \n", " \n", " \n", " \n", " 2.82\n", " \n", " \n", " \n", " \n", " 0.68\n", " \n", " \n", " \n", " \n", " -1.58\n", " \n", " \n", "
\n", " \n", " 1\n", " \n", " \n", " \n", " \n", " -1.75\n", " \n", " \n", " \n", " \n", " 1.56\n", " \n", " \n", " \n", " \n", " -1.13\n", " \n", " \n", " \n", " \n", " -1.1\n", " \n", " \n", " \n", " \n", " 1.03\n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " -2.46\n", " \n", " \n", " \n", " \n", " 3.45\n", " \n", " \n", " \n", " \n", " -1.66\n", " \n", " \n", " \n", " \n", " 1.27\n", " \n", " \n", " \n", " \n", " -0.52\n", " \n", " \n", " \n", " \n", " -0.02\n", " \n", " \n", " \n", " \n", " 1.52\n", " \n", " \n", " \n", " \n", " -1.09\n", " \n", " \n", " \n", " \n", " -1.86\n", " \n", " \n", " \n", " \n", " -1.13\n", " \n", " \n", " \n", " \n", " -0.68\n", " \n", " \n", " \n", " \n", " -0.81\n", " \n", " \n", " \n", " \n", " 0.35\n", " \n", " \n", " \n", " \n", " -0.06\n", " \n", " \n", " \n", " \n", " 1.79\n", " \n", " \n", " \n", " \n", " -2.82\n", " \n", " \n", " \n", " \n", " 2.26\n", " \n", " \n", " \n", " \n", " 0.78\n", " \n", " \n", " \n", " \n", " 0.44\n", " \n", " \n", "
\n", " \n", " 2\n", " \n", " \n", " \n", " \n", " -0.65\n", " \n", " \n", " \n", " \n", " 3.22\n", " \n", " \n", " \n", " \n", " -1.76\n", " \n", " \n", " \n", " \n", " 0.52\n", " \n", " \n", " \n", " \n", " 2.2\n", " \n", " \n", " \n", " \n", " -0.37\n", " \n", " \n", " \n", " \n", " -3.0\n", " \n", " \n", " \n", " \n", " 3.73\n", " \n", " \n", " \n", " \n", " -1.87\n", " \n", " \n", " \n", " \n", " 2.46\n", " \n", " \n", " \n", " \n", " 0.21\n", " \n", " \n", " \n", " \n", " -0.24\n", " \n", " \n", " \n", " \n", " -0.1\n", " \n", " \n", " \n", " \n", " -0.78\n", " \n", " \n", " \n", " \n", " -3.02\n", " \n", " \n", " \n", " \n", " -0.82\n", " \n", " \n", " \n", " \n", " -0.21\n", " \n", " \n", " \n", " \n", " -0.23\n", " \n", " \n", " \n", " \n", " 0.86\n", " \n", " \n", " \n", " \n", " -0.68\n", " \n", " \n", " \n", " \n", " 1.45\n", " \n", " \n", " \n", " \n", " -4.89\n", " \n", " \n", " \n", " \n", " 3.03\n", " \n", " \n", " \n", " \n", " 1.91\n", " \n", " \n", " \n", " \n", " 0.61\n", " \n", " \n", "
\n", " \n", " 3\n", " \n", " \n", " \n", " \n", " -1.62\n", " \n", " \n", " \n", " \n", " 3.71\n", " \n", " \n", " \n", " \n", " -2.31\n", " \n", " \n", " \n", " \n", " 0.43\n", " \n", " \n", " \n", " \n", " 4.17\n", " \n", " \n", " \n", " \n", " -0.43\n", " \n", " \n", " \n", " \n", " -3.86\n", " \n", " \n", " \n", " \n", " 4.16\n", " \n", " \n", " \n", " \n", " -2.15\n", " \n", " \n", " \n", " \n", " 1.08\n", " \n", " \n", " \n", " \n", " 0.12\n", " \n", " \n", " \n", " \n", " 0.6\n", " \n", " \n", " \n", " \n", " -0.89\n", " \n", " \n", " \n", " \n", " 0.27\n", " \n", " \n", " \n", " \n", " -3.67\n", " \n", " \n", " \n", " \n", " -2.71\n", " \n", " \n", " \n", " \n", " -0.31\n", " \n", " \n", " \n", " \n", " -1.59\n", " \n", " \n", " \n", " \n", " 1.35\n", " \n", " \n", " \n", " \n", " -1.83\n", " \n", " \n", " \n", " \n", " 0.91\n", " \n", " \n", " \n", " \n", " -5.8\n", " \n", " \n", " \n", " \n", " 2.81\n", " \n", " \n", " \n", " \n", " 2.11\n", " \n", " \n", " \n", " \n", " 0.28\n", " \n", " \n", "
\n", " \n", " 4\n", " \n", " \n", " \n", " \n", " -3.35\n", " \n", " \n", " \n", " \n", " 4.48\n", " \n", " \n", " \n", " \n", " -1.86\n", " \n", " \n", " \n", " \n", " -1.7\n", " \n", " \n", " \n", " \n", " 5.19\n", " \n", " \n", " \n", " \n", " -1.02\n", " \n", " \n", " \n", " \n", " -3.81\n", " \n", " \n", " \n", " \n", " 4.72\n", " \n", " \n", " \n", " \n", " -0.72\n", " \n", " \n", " \n", " \n", " 1.08\n", " \n", " \n", " \n", " \n", " -0.18\n", " \n", " \n", " \n", " \n", " 0.83\n", " \n", " \n", " \n", " \n", " -0.22\n", " \n", " \n", " \n", " \n", " -1.08\n", " \n", " \n", " \n", " \n", " -4.27\n", " \n", " \n", " \n", " \n", " -2.88\n", " \n", " \n", " \n", " \n", " -0.97\n", " \n", " \n", " \n", " \n", " -1.78\n", " \n", " \n", " \n", " \n", " 1.53\n", " \n", " \n", " \n", " \n", " -1.8\n", " \n", " \n", " \n", " \n", " 2.21\n", " \n", " \n", " \n", " \n", " -6.34\n", " \n", " \n", " \n", " \n", " 3.34\n", " \n", " \n", " \n", " \n", " 2.49\n", " \n", " \n", " \n", " \n", " 2.09\n", " \n", " \n", "
\n", " \n", " 5\n", " \n", " \n", " \n", " \n", " -0.84\n", " \n", " \n", " \n", " \n", " 4.23\n", " \n", " \n", " \n", " \n", " -1.65\n", " \n", " \n", " \n", " \n", " -2.0\n", " \n", " \n", " \n", " \n", " 5.34\n", " \n", " \n", " \n", " \n", " -0.99\n", " \n", " \n", " \n", " \n", " -4.13\n", " \n", " \n", " \n", " \n", " 3.94\n", " \n", " \n", " \n", " \n", " -1.06\n", " \n", " \n", " \n", " \n", " -0.94\n", " \n", " \n", " \n", " \n", " 1.24\n", " \n", " \n", " \n", " \n", " 0.09\n", " \n", " \n", " \n", " \n", " -1.78\n", " \n", " \n", " \n", " \n", " -0.11\n", " \n", " \n", " \n", " \n", " -4.45\n", " \n", " \n", " \n", " \n", " -0.85\n", " \n", " \n", " \n", " \n", " -2.06\n", " \n", " \n", " \n", " \n", " -1.35\n", " \n", " \n", " \n", " \n", " 0.8\n", " \n", " \n", " \n", " \n", " -1.63\n", " \n", " \n", " \n", " \n", " 1.54\n", " \n", " \n", " \n", " \n", " -6.51\n", " \n", " \n", " \n", " \n", " 2.8\n", " \n", " \n", " \n", " \n", " 2.14\n", " \n", " \n", " \n", " \n", " 3.77\n", " \n", " \n", "
\n", " \n", " 6\n", " \n", " \n", " \n", " \n", " -0.74\n", " \n", " \n", " \n", " \n", " 5.35\n", " \n", " \n", " \n", " \n", " -2.11\n", " \n", " \n", " \n", " \n", " -1.13\n", " \n", " \n", " \n", " \n", " 4.2\n", " \n", " \n", " \n", " \n", " -1.85\n", " \n", " \n", " \n", " \n", " -3.2\n", " \n", " \n", " \n", " \n", " 3.76\n", " \n", " \n", " \n", " \n", " -3.22\n", " \n", " \n", " \n", " \n", " -1.23\n", " \n", " \n", " \n", " \n", " 0.34\n", " \n", " \n", " \n", " \n", " 0.57\n", " \n", " \n", " \n", " \n", " -1.82\n", " \n", " \n", " \n", " \n", " 0.54\n", " \n", " \n", " \n", " \n", " -4.43\n", " \n", " \n", " \n", " \n", " -1.83\n", " \n", " \n", " \n", " \n", " -4.03\n", " \n", " \n", " \n", " \n", " -2.62\n", " \n", " \n", " \n", " \n", " -0.2\n", " \n", " \n", " \n", " \n", " -4.68\n", " \n", " \n", " \n", " \n", " 1.93\n", " \n", " \n", " \n", " \n", " -8.46\n", " \n", " \n", " \n", " \n", " 3.34\n", " \n", " \n", " \n", " \n", " 2.52\n", " \n", " \n", " \n", " \n", " 5.81\n", " \n", " \n", "
\n", " \n", " 7\n", " \n", " \n", " \n", " \n", " -0.44\n", " \n", " \n", " \n", " \n", " 4.69\n", " \n", " \n", " \n", " \n", " -2.3\n", " \n", " \n", " \n", " \n", " -0.21\n", " \n", " \n", " \n", " \n", " 5.93\n", " \n", " \n", " \n", " \n", " -2.63\n", " \n", " \n", " \n", " \n", " -1.83\n", " \n", " \n", " \n", " \n", " 5.46\n", " \n", " \n", " \n", " \n", " -4.5\n", " \n", " \n", " \n", " \n", " -3.16\n", " \n", " \n", " \n", " \n", " -1.73\n", " \n", " \n", " \n", " \n", " 0.18\n", " \n", " \n", " \n", " \n", " 0.11\n", " \n", " \n", " \n", " \n", " 0.04\n", " \n", " \n", " \n", " \n", " -5.99\n", " \n", " \n", " \n", " \n", " -0.45\n", " \n", " \n", " \n", " \n", " -6.2\n", " \n", " \n", " \n", " \n", " -3.89\n", " \n", " \n", " \n", " \n", " 0.71\n", " \n", " \n", " \n", " \n", " -3.95\n", " \n", " \n", " \n", " \n", " 0.67\n", " \n", " \n", " \n", " \n", " -7.26\n", " \n", " \n", " \n", " \n", " 2.97\n", " \n", " \n", " \n", " \n", " 3.39\n", " \n", " \n", " \n", " \n", " 6.66\n", " \n", " \n", "
\n", " \n", " 8\n", " \n", " \n", " \n", " \n", " 0.92\n", " \n", " \n", " \n", " \n", " 5.8\n", " \n", " \n", " \n", " \n", " -3.33\n", " \n", " \n", " \n", " \n", " -0.65\n", " \n", " \n", " \n", " \n", " 5.99\n", " \n", " \n", " \n", " \n", " -3.19\n", " \n", " \n", " \n", " \n", " -1.83\n", " \n", " \n", " \n", " \n", " 5.63\n", " \n", " \n", " \n", " \n", " -3.53\n", " \n", " \n", " \n", " \n", " -1.3\n", " \n", " \n", " \n", " \n", " -1.61\n", " \n", " \n", " \n", " \n", " 0.82\n", " \n", " \n", " \n", " \n", " -2.45\n", " \n", " \n", " \n", " \n", " -0.4\n", " \n", " \n", " \n", " \n", " -6.06\n", " \n", " \n", " \n", " \n", " -0.52\n", " \n", " \n", " \n", " \n", " -6.6\n", " \n", " \n", " \n", " \n", " -3.48\n", " \n", " \n", " \n", " \n", " -0.04\n", " \n", " \n", " \n", " \n", " -4.6\n", " \n", " \n", " \n", " \n", " 0.51\n", " \n", " \n", " \n", " \n", " -5.85\n", " \n", " \n", " \n", " \n", " 3.23\n", " \n", " \n", " \n", " \n", " 2.4\n", " \n", " \n", " \n", " \n", " 5.08\n", " \n", " \n", "
\n", " \n", " 9\n", " \n", " \n", " \n", " \n", " 0.38\n", " \n", " \n", " \n", " \n", " 5.54\n", " \n", " \n", " \n", " \n", " -4.49\n", " \n", " \n", " \n", " \n", " -0.8\n", " \n", " \n", " \n", " \n", " 7.05\n", " \n", " \n", " \n", " \n", " -2.64\n", " \n", " \n", " \n", " \n", " -0.44\n", " \n", " \n", " \n", " \n", " 5.35\n", " \n", " \n", " \n", " \n", " -1.96\n", " \n", " \n", " \n", " \n", " -0.33\n", " \n", " \n", " \n", " \n", " -0.8\n", " \n", " \n", " \n", " \n", " 0.26\n", " \n", " \n", " \n", " \n", " -3.37\n", " \n", " \n", " \n", " \n", " -0.82\n", " \n", " \n", " \n", " \n", " -6.05\n", " \n", " \n", " \n", " \n", " -2.61\n", " \n", " \n", " \n", " \n", " -8.45\n", " \n", " \n", " \n", " \n", " -4.45\n", " \n", " \n", " \n", " \n", " 0.41\n", " \n", " \n", " \n", " \n", " -4.71\n", " \n", " \n", " \n", " \n", " 1.89\n", " \n", " \n", " \n", " \n", " -6.93\n", " \n", " \n", " \n", " \n", " 2.14\n", " \n", " \n", " \n", " \n", " 3.0\n", " \n", " \n", " \n", " \n", " 5.16\n", " \n", " \n", "
\n", " \n", " 10\n", " \n", " \n", " \n", " \n", " 2.06\n", " \n", " \n", " \n", " \n", " 5.84\n", " \n", " \n", " \n", " \n", " -3.9\n", " \n", " \n", " \n", " \n", " -0.98\n", " \n", " \n", " \n", " \n", " 7.78\n", " \n", " \n", " \n", " \n", " -2.49\n", " \n", " \n", " \n", " \n", " -0.59\n", " \n", " \n", " \n", " \n", " 5.59\n", " \n", " \n", " \n", " \n", " -2.22\n", " \n", " \n", " \n", " \n", " -0.71\n", " \n", " \n", " \n", " \n", " -0.46\n", " \n", " \n", " \n", " \n", " 1.8\n", " \n", " \n", " \n", " \n", " -2.79\n", " \n", " \n", " \n", " \n", " 0.48\n", " \n", " \n", " \n", " \n", " -5.97\n", " \n", " \n", " \n", " \n", " -3.44\n", " \n", " \n", " \n", " \n", " -7.77\n", " \n", " \n", " \n", " \n", " -5.49\n", " \n", " \n", " \n", " \n", " -0.7\n", " \n", " \n", " \n", " \n", " -4.61\n", " \n", " \n", " \n", " \n", " -0.52\n", " \n", " \n", " \n", " \n", " -7.72\n", " \n", " \n", " \n", " \n", " 1.54\n", " \n", " \n", " \n", " \n", " 5.02\n", " \n", " \n", " \n", " \n", " 5.81\n", " \n", " \n", "
\n", " \n", " 11\n", " \n", " \n", " \n", " \n", " 1.86\n", " \n", " \n", " \n", " \n", " 4.47\n", " \n", " \n", " \n", " \n", " -2.17\n", " \n", " \n", " \n", " \n", " -1.38\n", " \n", " \n", " \n", " \n", " 5.9\n", " \n", " \n", " \n", " \n", " -0.49\n", " \n", " \n", " \n", " \n", " 0.02\n", " \n", " \n", " \n", " \n", " 5.78\n", " \n", " \n", " \n", " \n", " -1.04\n", " \n", " \n", " \n", " \n", " -0.6\n", " \n", " \n", " \n", " \n", " 0.49\n", " \n", " \n", " \n", " \n", " 1.96\n", " \n", " \n", " \n", " \n", " -1.47\n", " \n", " \n", " \n", " \n", " 1.88\n", " \n", " \n", " \n", " \n", " -5.92\n", " \n", " \n", " \n", " \n", " -4.55\n", " \n", " \n", " \n", " \n", " -8.15\n", " \n", " \n", " \n", " \n", " -3.42\n", " \n", " \n", " \n", " \n", " -2.24\n", " \n", " \n", " \n", " \n", " -4.33\n", " \n", " \n", " \n", " \n", " -1.17\n", " \n", " \n", " \n", " \n", " -7.9\n", " \n", " \n", " \n", " \n", " 1.36\n", " \n", " \n", " \n", " \n", " 5.31\n", " \n", " \n", " \n", " \n", " 5.83\n", " \n", " \n", "
\n", " \n", " 12\n", " \n", " \n", " \n", " \n", " 3.19\n", " \n", " \n", " \n", " \n", " 4.22\n", " \n", " \n", " \n", " \n", " -3.06\n", " \n", " \n", " \n", " \n", " -2.27\n", " \n", " \n", " \n", " \n", " 5.93\n", " \n", " \n", " \n", " \n", " -2.64\n", " \n", " \n", " \n", " \n", " 0.33\n", " \n", " \n", " \n", " \n", " 6.72\n", " \n", " \n", " \n", " \n", " -2.84\n", " \n", " \n", " \n", " \n", " -0.2\n", " \n", " \n", " \n", " \n", " 1.89\n", " \n", " \n", " \n", " \n", " 2.63\n", " \n", " \n", " \n", " \n", " -1.53\n", " \n", " \n", " \n", " \n", " 0.75\n", " \n", " \n", " \n", " \n", " -5.27\n", " \n", " \n", " \n", " \n", " -4.53\n", " \n", " \n", " \n", " \n", " -7.57\n", " \n", " \n", " \n", " \n", " -2.85\n", " \n", " \n", " \n", " \n", " -2.17\n", " \n", " \n", " \n", " \n", " -4.78\n", " \n", " \n", " \n", " \n", " -1.13\n", " \n", " \n", " \n", " \n", " -8.99\n", " \n", " \n", " \n", " \n", " 2.11\n", " \n", " \n", " \n", " \n", " 6.42\n", " \n", " \n", " \n", " \n", " 5.6\n", " \n", " \n", "
\n", " \n", " 13\n", " \n", " \n", " \n", " \n", " 2.31\n", " \n", " \n", " \n", " \n", " 4.45\n", " \n", " \n", " \n", " \n", " -3.87\n", " \n", " \n", " \n", " \n", " -2.05\n", " \n", " \n", " \n", " \n", " 6.76\n", " \n", " \n", " \n", " \n", " -3.25\n", " \n", " \n", " \n", " \n", " -2.17\n", " \n", " \n", " \n", " \n", " 7.99\n", " \n", " \n", " \n", " \n", " -2.56\n", " \n", " \n", " \n", " \n", " -0.8\n", " \n", " \n", " \n", " \n", " 0.71\n", " \n", " \n", " \n", " \n", " 2.33\n", " \n", " \n", " \n", " \n", " -0.16\n", " \n", " \n", " \n", " \n", " -0.46\n", " \n", " \n", " \n", " \n", " -5.1\n", " \n", " \n", " \n", " \n", " -3.79\n", " \n", " \n", " \n", " \n", " -7.58\n", " \n", " \n", " \n", " \n", " -4.0\n", " \n", " \n", " \n", " \n", " 0.33\n", " \n", " \n", " \n", " \n", " -3.67\n", " \n", " \n", " \n", " \n", " -1.05\n", " \n", " \n", " \n", " \n", " -8.71\n", " \n", " \n", " \n", " \n", " 2.47\n", " \n", " \n", " \n", " \n", " 5.87\n", " \n", " \n", " \n", " \n", " 6.71\n", " \n", " \n", "
\n", " \n", " 14\n", " \n", " \n", " \n", " \n", " 3.78\n", " \n", " \n", " \n", " \n", " 4.33\n", " \n", " \n", " \n", " \n", " -3.88\n", " \n", " \n", " \n", " \n", " -1.58\n", " \n", " \n", " \n", " \n", " 6.22\n", " \n", " \n", " \n", " \n", " -3.23\n", " \n", " \n", " \n", " \n", " -1.46\n", " \n", " \n", " \n", " \n", " 5.57\n", " \n", " \n", " \n", " \n", " -2.93\n", " \n", " \n", " \n", " \n", " -0.33\n", " \n", " \n", " \n", " \n", " -0.97\n", " \n", " \n", " \n", " \n", " 1.72\n", " \n", " \n", " \n", " \n", " 3.61\n", " \n", " \n", " \n", " \n", " 0.29\n", " \n", " \n", " \n", " \n", " -4.21\n", " \n", " \n", " \n", " \n", " -4.1\n", " \n", " \n", " \n", " \n", " -6.68\n", " \n", " \n", " \n", " \n", " -4.5\n", " \n", " \n", " \n", " \n", " -2.19\n", " \n", " \n", " \n", " \n", " -2.43\n", " \n", " \n", " \n", " \n", " -1.64\n", " \n", " \n", " \n", " \n", " -9.36\n", " \n", " \n", " \n", " \n", " 3.36\n", " \n", " \n", " \n", " \n", " 6.11\n", " \n", " \n", " \n", " \n", " 7.53\n", " \n", " \n", "
\n", " \n", " 15\n", " \n", " \n", " \n", " \n", " 5.64\n", " \n", " \n", " \n", " \n", " 5.31\n", " \n", " \n", " \n", " \n", " -3.98\n", " \n", " \n", " \n", " \n", " -2.26\n", " \n", " \n", " \n", " \n", " 5.91\n", " \n", " \n", " \n", " \n", " -3.3\n", " \n", " \n", " \n", " \n", " -1.03\n", " \n", " \n", " \n", " \n", " 5.68\n", " \n", " \n", " \n", " \n", " -3.06\n", " \n", " \n", " \n", " \n", " -0.33\n", " \n", " \n", " \n", " \n", " -1.16\n", " \n", " \n", " \n", " \n", " 2.19\n", " \n", " \n", " \n", " \n", " 4.2\n", " \n", " \n", " \n", " \n", " 1.01\n", " \n", " \n", " \n", " \n", " -3.22\n", " \n", " \n", " \n", " \n", " -4.31\n", " \n", " \n", " \n", " \n", " -5.74\n", " \n", " \n", " \n", " \n", " -4.44\n", " \n", " \n", " \n", " \n", " -2.3\n", " \n", " \n", " \n", " \n", " -1.36\n", " \n", " \n", " \n", " \n", " -1.2\n", " \n", " \n", " \n", " \n", " -11.27\n", " \n", " \n", " \n", " \n", " 2.59\n", " \n", " \n", " \n", " \n", " 6.69\n", " \n", " \n", " \n", " \n", " 5.91\n", " \n", " \n", "
\n", " \n", " 16\n", " \n", " \n", " \n", " \n", " 4.08\n", " \n", " \n", " \n", " \n", " 4.34\n", " \n", " \n", " \n", " \n", " -2.44\n", " \n", " \n", " \n", " \n", " -3.3\n", " \n", " \n", " \n", " \n", " 6.04\n", " \n", " \n", " \n", " \n", " -2.52\n", " \n", " \n", " \n", " \n", " -0.47\n", " \n", " \n", " \n", " \n", " 5.28\n", " \n", " \n", " \n", " \n", " -4.84\n", " \n", " \n", " \n", " \n", " 1.58\n", " \n", " \n", " \n", " \n", " 0.23\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 5.79\n", " \n", " \n", " \n", " \n", " 1.8\n", " \n", " \n", " \n", " \n", " -3.13\n", " \n", " \n", " \n", " \n", " -3.85\n", " \n", " \n", " \n", " \n", " -5.53\n", " \n", " \n", " \n", " \n", " -2.97\n", " \n", " \n", " \n", " \n", " -2.13\n", " \n", " \n", " \n", " \n", " -1.15\n", " \n", " \n", " \n", " \n", " -0.56\n", " \n", " \n", " \n", " \n", " -13.13\n", " \n", " \n", " \n", " \n", " 2.07\n", " \n", " \n", " \n", " \n", " 6.16\n", " \n", " \n", " \n", " \n", " 4.94\n", " \n", " \n", "
\n", " \n", " 17\n", " \n", " \n", " \n", " \n", " 5.64\n", " \n", " \n", " \n", " \n", " 4.57\n", " \n", " \n", " \n", " \n", " -3.53\n", " \n", " \n", " \n", " \n", " -3.76\n", " \n", " \n", " \n", " \n", " 6.58\n", " \n", " \n", " \n", " \n", " -2.58\n", " \n", " \n", " \n", " \n", " -0.75\n", " \n", " \n", " \n", " \n", " 6.58\n", " \n", " \n", " \n", " \n", " -4.78\n", " \n", " \n", " \n", " \n", " 3.63\n", " \n", " \n", " \n", " \n", " -0.29\n", " \n", " \n", " \n", " \n", " 0.56\n", " \n", " \n", " \n", " \n", " 5.76\n", " \n", " \n", " \n", " \n", " 2.05\n", " \n", " \n", " \n", " \n", " -2.27\n", " \n", " \n", " \n", " \n", " -2.31\n", " \n", " \n", " \n", " \n", " -4.95\n", " \n", " \n", " \n", " \n", " -3.16\n", " \n", " \n", " \n", " \n", " -3.06\n", " \n", " \n", " \n", " \n", " -2.43\n", " \n", " \n", " \n", " \n", " 0.84\n", " \n", " \n", " \n", " \n", " -12.57\n", " \n", " \n", " \n", " \n", " 3.56\n", " \n", " \n", " \n", " \n", " 7.36\n", " \n", " \n", " \n", " \n", " 4.7\n", " \n", " \n", "
\n", " \n", " 18\n", " \n", " \n", " \n", " \n", " 5.99\n", " \n", " \n", " \n", " \n", " 5.82\n", " \n", " \n", " \n", " \n", " -2.85\n", " \n", " \n", " \n", " \n", " -4.15\n", " \n", " \n", " \n", " \n", " 7.12\n", " \n", " \n", " \n", " \n", " -3.32\n", " \n", " \n", " \n", " \n", " -1.21\n", " \n", " \n", " \n", " \n", " 7.93\n", " \n", " \n", " \n", " \n", " -4.85\n", " \n", " \n", " \n", " \n", " 1.44\n", " \n", " \n", " \n", " \n", " -0.63\n", " \n", " \n", " \n", " \n", " 0.35\n", " \n", " \n", " \n", " \n", " 7.47\n", " \n", " \n", " \n", " \n", " 0.87\n", " \n", " \n", " \n", " \n", " -1.52\n", " \n", " \n", " \n", " \n", " -2.09\n", " \n", " \n", " \n", " \n", " -4.23\n", " \n", " \n", " \n", " \n", " -2.55\n", " \n", " \n", " \n", " \n", " -2.46\n", " \n", " \n", " \n", " \n", " -2.89\n", " \n", " \n", " \n", " \n", " 1.9\n", " \n", " \n", " \n", " \n", " -9.74\n", " \n", " \n", " \n", " \n", " 3.43\n", " \n", " \n", " \n", " \n", " 7.07\n", " \n", " \n", " \n", " \n", " 4.39\n", " \n", " \n", "
\n", " \n", " 19\n", " \n", " \n", " \n", " \n", " 4.03\n", " \n", " \n", " \n", " \n", " 6.23\n", " \n", " \n", " \n", " \n", " -4.1\n", " \n", " \n", " \n", " \n", " -4.11\n", " \n", " \n", " \n", " \n", " 7.19\n", " \n", " \n", " \n", " \n", " -4.1\n", " \n", " \n", " \n", " \n", " -1.52\n", " \n", " \n", " \n", " \n", " 6.53\n", " \n", " \n", " \n", " \n", " -5.21\n", " \n", " \n", " \n", " \n", " -0.24\n", " \n", " \n", " \n", " \n", " 0.01\n", " \n", " \n", " \n", " \n", " 1.16\n", " \n", " \n", " \n", " \n", " 6.43\n", " \n", " \n", " \n", " \n", " -1.97\n", " \n", " \n", " \n", " \n", " -2.64\n", " \n", " \n", " \n", " \n", " -1.66\n", " \n", " \n", " \n", " \n", " -5.2\n", " \n", " \n", " \n", " \n", " -3.25\n", " \n", " \n", " \n", " \n", " -2.87\n", " \n", " \n", " \n", " \n", " -1.65\n", " \n", " \n", " \n", " \n", " 1.64\n", " \n", " \n", " \n", " \n", " -10.66\n", " \n", " \n", " \n", " \n", " 2.83\n", " \n", " \n", " \n", " \n", " 7.48\n", " \n", " \n", " \n", " \n", " 3.94\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(25)\n", "cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)\n", "df = pd.DataFrame(np.random.randn(20, 25)).cumsum()\n", "\n", "df.style.background_gradient(cmap, axis=1)\\\n", " .set_properties(**{'max-width': '80px', 'font-size': '1pt'})\\\n", " .set_caption(\"Hover to magify\")\\\n", " .set_precision(2)\\\n", " .set_table_styles(magnify())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Extensibility\n", "\n", "The core of pandas is, and will remain, its \"high-performance, easy-to-use data structures\".\n", "With that in mind, we hope that `DataFrame.style` accomplishes two goals\n", "\n", "- Provide an API that is pleasing to use interactively and is \"good enough\" for many tasks\n", "- Provide the foundations for dedicated libraries to build on\n", "\n", "If you build a great library on top of this, let us know and we'll [link](http://pandas.pydata.org/pandas-docs/stable/ecosystem.html) to it.\n", "\n", "## Subclassing\n", "\n", "This section contains a bit of information about the implementation of `Styler`.\n", "Since the feature is so new all of this is subject to change, even more so than the end-use API.\n", "\n", "As users apply styles (via `.apply`, `.applymap` or one of the builtins), we don't actually calculate anything.\n", "Instead, we append functions and arguments to a list `self._todo`.\n", "When asked (typically in `.render` we'll walk through the list and execute each function (this is in `self._compute()`.\n", "These functions update an internal `defaultdict(list)`, `self.ctx` which maps DataFrame row / column positions to CSS attribute, value pairs.\n", "\n", "We take the extra step through `self._todo` so that we can export styles and set them on other `Styler`s.\n", "\n", "Rendering uses [Jinja](http://jinja.pocoo.org/) templates.\n", "The `.translate` method takes `self.ctx` and builds another dictionary ready to be passed into `Styler.template.render`, the Jinja template.\n", "\n", "\n", "## Alternate templates\n", "\n", "We've used [Jinja](http://jinja.pocoo.org/) templates to build up the HTML.\n", "The template is stored as a class variable ``Styler.template.``. Subclasses can override that.\n", "\n", "```python\n", "class CustomStyle(Styler):\n", " template = Template(\"\"\"...\"\"\")\n", "```" ] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }