{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Pandas Style API\n", "\n", "Content to accompany blog post on [Practical Business Python](http://pbpython.com/styling-pandas.html)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sparklines import sparklines" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel('https://github.com/chris1610/pbpython/blob/master/data/2018_Sales_Total.xlsx?raw=true')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912018-01-01 07:21:51
1714466Trantow-BarrowsS2-77896-163.16-63.162018-01-01 10:00:47
2218895Kulas IncB1-699242390.702086.102018-01-01 13:24:58
3307599Kassulke, Ondricka and MetzS1-654814121.05863.052018-01-01 15:05:22
4412290Jerde-HilpertS2-34077683.21499.262018-01-01 23:26:55
\n", "
" ], "text/plain": [ " account number name sku quantity \\\n", "0 740150 Barton LLC B1-20000 39 \n", "1 714466 Trantow-Barrows S2-77896 -1 \n", "2 218895 Kulas Inc B1-69924 23 \n", "3 307599 Kassulke, Ondricka and Metz S1-65481 41 \n", "4 412290 Jerde-Hilpert S2-34077 6 \n", "\n", " unit price ext price date \n", "0 86.69 3380.91 2018-01-01 07:21:51 \n", "1 63.16 -63.16 2018-01-01 10:00:47 \n", "2 90.70 2086.10 2018-01-01 13:24:58 \n", "3 21.05 863.05 2018-01-01 15:05:22 \n", "4 83.21 499.26 2018-01-01 23:26:55 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Do a simple groupby to look at the performance by customr" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
meansum
name
Barton LLC1334.615854109438.50
Cronin, Oberbrunner and Spencer1339.32164289734.55
Frami, Hills and Schmidt1438.466528103569.59
Fritsch, Russel and Anderson1385.366790112214.71
Halvorson, Crona and Champlin1206.97172470004.36
Herman LLC1336.53225882865.00
Jerde-Hilpert1265.072247112591.43
Kassulke, Ondricka and Metz1350.79796986451.07
Keeling LLC1363.977027100934.30
Kiehn-Spinka1260.87050699608.77
Koepp Ltd1264.152927103660.54
Kuhn-Gusikowski1247.86684991094.28
Kulas Inc1461.191064137351.96
Pollich LLC1196.53671287347.18
Purdy-Kunde1469.77754777898.21
Sanford and Sons1391.87295898822.98
Stokes LLC1271.33222291535.92
Trantow-Barrows1312.567872123381.38
White-Trantow1579.558023135841.99
Will LLC1411.318919104437.60
\n", "
" ], "text/plain": [ " mean sum\n", "name \n", "Barton LLC 1334.615854 109438.50\n", "Cronin, Oberbrunner and Spencer 1339.321642 89734.55\n", "Frami, Hills and Schmidt 1438.466528 103569.59\n", "Fritsch, Russel and Anderson 1385.366790 112214.71\n", "Halvorson, Crona and Champlin 1206.971724 70004.36\n", "Herman LLC 1336.532258 82865.00\n", "Jerde-Hilpert 1265.072247 112591.43\n", "Kassulke, Ondricka and Metz 1350.797969 86451.07\n", "Keeling LLC 1363.977027 100934.30\n", "Kiehn-Spinka 1260.870506 99608.77\n", "Koepp Ltd 1264.152927 103660.54\n", "Kuhn-Gusikowski 1247.866849 91094.28\n", "Kulas Inc 1461.191064 137351.96\n", "Pollich LLC 1196.536712 87347.18\n", "Purdy-Kunde 1469.777547 77898.21\n", "Sanford and Sons 1391.872958 98822.98\n", "Stokes LLC 1271.332222 91535.92\n", "Trantow-Barrows 1312.567872 123381.38\n", "White-Trantow 1579.558023 135841.99\n", "Will LLC 1411.318919 104437.60" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('name')['ext price'].agg(['mean', 'sum'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Style the currency using python's string formatting" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean sum
name
Barton LLC$1,334.62$109,438.50
Cronin, Oberbrunner and Spencer$1,339.32$89,734.55
Frami, Hills and Schmidt$1,438.47$103,569.59
Fritsch, Russel and Anderson$1,385.37$112,214.71
Halvorson, Crona and Champlin$1,206.97$70,004.36
Herman LLC$1,336.53$82,865.00
Jerde-Hilpert$1,265.07$112,591.43
Kassulke, Ondricka and Metz$1,350.80$86,451.07
Keeling LLC$1,363.98$100,934.30
Kiehn-Spinka$1,260.87$99,608.77
Koepp Ltd$1,264.15$103,660.54
Kuhn-Gusikowski$1,247.87$91,094.28
Kulas Inc$1,461.19$137,351.96
Pollich LLC$1,196.54$87,347.18
Purdy-Kunde$1,469.78$77,898.21
Sanford and Sons$1,391.87$98,822.98
Stokes LLC$1,271.33$91,535.92
Trantow-Barrows$1,312.57$123,381.38
White-Trantow$1,579.56$135,841.99
Will LLC$1,411.32$104,437.60
" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(df.groupby('name')['ext price']\n", " .agg(['mean', 'sum'])\n", " .style.format('${0:,.2f}'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Round the results to 0 decimals" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean sum
name
Barton LLC$1,335$109,438
Cronin, Oberbrunner and Spencer$1,339$89,735
Frami, Hills and Schmidt$1,438$103,570
Fritsch, Russel and Anderson$1,385$112,215
Halvorson, Crona and Champlin$1,207$70,004
Herman LLC$1,337$82,865
Jerde-Hilpert$1,265$112,591
Kassulke, Ondricka and Metz$1,351$86,451
Keeling LLC$1,364$100,934
Kiehn-Spinka$1,261$99,609
Koepp Ltd$1,264$103,661
Kuhn-Gusikowski$1,248$91,094
Kulas Inc$1,461$137,352
Pollich LLC$1,197$87,347
Purdy-Kunde$1,470$77,898
Sanford and Sons$1,392$98,823
Stokes LLC$1,271$91,536
Trantow-Barrows$1,313$123,381
White-Trantow$1,580$135,842
Will LLC$1,411$104,438
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(df.groupby('name')['ext price']\n", " .agg(['mean', 'sum'])\n", " .style.format('${0:,.0f}'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More complex analysis of performance by month" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datesumpct_of_total
02018-01-31185361.660.091818
12018-02-28146211.620.072426
22018-03-31203921.380.101012
32018-04-30174574.110.086475
42018-05-31165418.550.081940
52018-06-30174089.330.086235
62018-07-31191662.110.094939
72018-08-31153778.590.076174
82018-09-30168443.170.083438
92018-10-31171495.320.084950
102018-11-30119961.220.059423
112018-12-31163867.260.081171
\n", "
" ], "text/plain": [ " date sum pct_of_total\n", "0 2018-01-31 185361.66 0.091818\n", "1 2018-02-28 146211.62 0.072426\n", "2 2018-03-31 203921.38 0.101012\n", "3 2018-04-30 174574.11 0.086475\n", "4 2018-05-31 165418.55 0.081940\n", "5 2018-06-30 174089.33 0.086235\n", "6 2018-07-31 191662.11 0.094939\n", "7 2018-08-31 153778.59 0.076174\n", "8 2018-09-30 168443.17 0.083438\n", "9 2018-10-31 171495.32 0.084950\n", "10 2018-11-30 119961.22 0.059423\n", "11 2018-12-31 163867.26 0.081171" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monthly_sales = df.groupby([pd.Grouper(key='date', freq='M')])['ext price'].agg(['sum']).reset_index()\n", "monthly_sales['pct_of_total'] = monthly_sales['sum'] / df['ext price'].sum()\n", "monthly_sales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use a format dictionary to control formatting per column" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date sum pct_of_total
01-2018$185,3629.18%
02-2018$146,2127.24%
03-2018$203,92110.10%
04-2018$174,5748.65%
05-2018$165,4198.19%
06-2018$174,0898.62%
07-2018$191,6629.49%
08-2018$153,7797.62%
09-2018$168,4438.34%
10-2018$171,4958.49%
11-2018$119,9615.94%
12-2018$163,8678.12%
" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "format_dict = {'sum':'${0:,.0f}', 'date': '{:%m-%Y}', 'pct_of_total': '{:.2%}'}\n", "monthly_sales.style.format(format_dict).hide_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Introduce the highlight functions" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date sum pct_of_total
01-2018$185,3629.18%
02-2018$146,2127.24%
03-2018$203,92110.10%
04-2018$174,5748.65%
05-2018$165,4198.19%
06-2018$174,0898.62%
07-2018$191,6629.49%
08-2018$153,7797.62%
09-2018$168,4438.34%
10-2018$171,4958.49%
11-2018$119,9615.94%
12-2018$163,8678.12%
" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(monthly_sales\n", " .style\n", " .format(format_dict)\n", " .hide_index()\n", " .highlight_max(color='lightgreen')\n", " .highlight_min(color='#cd4f39'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Introduce bar formatting for table cells" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
2018 Sales Performance
date sum pct_of_total
01-2018$185,3629.18%
02-2018$146,2127.24%
03-2018$203,92110.10%
04-2018$174,5748.65%
05-2018$165,4198.19%
06-2018$174,0898.62%
07-2018$191,6629.49%
08-2018$153,7797.62%
09-2018$168,4438.34%
10-2018$171,4958.49%
11-2018$119,9615.94%
12-2018$163,8678.12%
" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(monthly_sales\n", " .style\n", " .format(format_dict)\n", " .hide_index()\n", ".bar(color='#FFA07A', vmin=100_000, subset=['sum'], align='zero')\n", ".bar(color='lightgreen', vmin=0, subset=['pct_of_total'], align='zero')\n", ".set_caption('2018 Sales Performance'))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date sum pct_of_total
001-2018$185,3629.18%
102-2018$146,2127.24%
203-2018$203,92110.10%
304-2018$174,5748.65%
405-2018$165,4198.19%
506-2018$174,0898.62%
607-2018$191,6629.49%
708-2018$153,7797.62%
809-2018$168,4438.34%
910-2018$171,4958.49%
1011-2018$119,9615.94%
1112-2018$163,8678.12%
" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(monthly_sales.style\n", " .format(format_dict)\n", " .background_gradient(subset=['sum'],cmap='BuGn'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cool example of using sparklines from Peter Baumgartner\n", "https://twitter.com/pmbaumgartner/status/1084645440224559104" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def sparkline_str(x):\n", " bins=np.histogram(x)[0]\n", " sl = ''.join(sparklines(bins))\n", " return sl\n", "sparkline_str.__name__ = \"sparkline\"" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
quantityext price
meansparklinemeansparkline
name
Barton LLC24.890244▄▄▃▂▃▆▄█▁▄1334.615854█▄▃▆▄▄▁▁▁▁
Cronin, Oberbrunner and Spencer24.970149█▄▁▄▄▇▅▁▄▄1339.321642█▅▅▃▃▃▂▂▁▁
Frami, Hills and Schmidt26.430556▄▄▁▂▇█▂▂▅▅1438.466528█▅▄▇▅▃▄▁▁▁
Fritsch, Russel and Anderson26.074074▁▄▇▃▂▂█▃▄▄1385.366790▇█▃▄▂▂▁▂▁▁
Halvorson, Crona and Champlin22.137931▇▆▆▇█▁▄▂▄▃1206.971724██▆▅▁▃▂▂▂▂
Herman LLC24.806452▄▃▅▁▆▄▂▆▃█1336.532258█▅▇▄▅▄▁▃▂▂
Jerde-Hilpert22.460674▄▄█▁▂▅▃▂▄▃1265.072247█▄▅▂▁▂▃▂▂▁
Kassulke, Ondricka and Metz25.734375▂▂▁▁▂▂▁▅▄█1350.797969█▆▆▄▄▃▂▁▁▂
Keeling LLC24.405405▁▄▇▃▅█▃▄▃▆1363.977027▅█▆▃▄▂▂▁▁▁
Kiehn-Spinka22.227848▃▂█▂▃▅▄▁▄▁1260.870506█▇▄▃▃▂▁▂▁▁
Koepp Ltd21.829268▅▇█▆▄▇▅▁▅▇1264.152927█▇▅▂▄▂▂▂▁▁
Kuhn-Gusikowski22.808219▂▄█▄▃▁█▄▂▄1247.866849▆█▄▃▃▃▃▁▁▁
Kulas Inc24.095745▇▃▇▂▇▁▅▆█▆1461.191064█▅█▂▄▄▄▂▁▁
Pollich LLC23.383562█▂▅▂▃▆▁▂▄▇1196.536712█▆▆▃▃▃▂▂▁▁
Purdy-Kunde27.358491▄▅█▁▄▇▅█▇█1469.777547█▅▄▃▄▃▃▂▁▂
Sanford and Sons24.000000▂▂▂▆▁█▂▂▁▅1391.872958▅▇█▃▃▄▁▃▁▂
Stokes LLC24.527778▄▄▄▁▃▂▄█▄▄1271.332222█▇▆▆▄▂▂▃▁▂
Trantow-Barrows24.159574▅▄▅▂▃▃▄▄▁█1312.567872█▇▅▆▃▂▂▁▁▁
White-Trantow26.255814▃▂▆▆▃██▁██1579.558023▄█▆▅▄▃▄▂▁▃
Will LLC24.702703▂█▁▄▄▄▂▅▅▄1411.318919▆█▄▅▄▂▁▂▁▂
\n", "
" ], "text/plain": [ " quantity ext price \\\n", " mean sparkline mean \n", "name \n", "Barton LLC 24.890244 ▄▄▃▂▃▆▄█▁▄ 1334.615854 \n", "Cronin, Oberbrunner and Spencer 24.970149 █▄▁▄▄▇▅▁▄▄ 1339.321642 \n", "Frami, Hills and Schmidt 26.430556 ▄▄▁▂▇█▂▂▅▅ 1438.466528 \n", "Fritsch, Russel and Anderson 26.074074 ▁▄▇▃▂▂█▃▄▄ 1385.366790 \n", "Halvorson, Crona and Champlin 22.137931 ▇▆▆▇█▁▄▂▄▃ 1206.971724 \n", "Herman LLC 24.806452 ▄▃▅▁▆▄▂▆▃█ 1336.532258 \n", "Jerde-Hilpert 22.460674 ▄▄█▁▂▅▃▂▄▃ 1265.072247 \n", "Kassulke, Ondricka and Metz 25.734375 ▂▂▁▁▂▂▁▅▄█ 1350.797969 \n", "Keeling LLC 24.405405 ▁▄▇▃▅█▃▄▃▆ 1363.977027 \n", "Kiehn-Spinka 22.227848 ▃▂█▂▃▅▄▁▄▁ 1260.870506 \n", "Koepp Ltd 21.829268 ▅▇█▆▄▇▅▁▅▇ 1264.152927 \n", "Kuhn-Gusikowski 22.808219 ▂▄█▄▃▁█▄▂▄ 1247.866849 \n", "Kulas Inc 24.095745 ▇▃▇▂▇▁▅▆█▆ 1461.191064 \n", "Pollich LLC 23.383562 █▂▅▂▃▆▁▂▄▇ 1196.536712 \n", "Purdy-Kunde 27.358491 ▄▅█▁▄▇▅█▇█ 1469.777547 \n", "Sanford and Sons 24.000000 ▂▂▂▆▁█▂▂▁▅ 1391.872958 \n", "Stokes LLC 24.527778 ▄▄▄▁▃▂▄█▄▄ 1271.332222 \n", "Trantow-Barrows 24.159574 ▅▄▅▂▃▃▄▄▁█ 1312.567872 \n", "White-Trantow 26.255814 ▃▂▆▆▃██▁██ 1579.558023 \n", "Will LLC 24.702703 ▂█▁▄▄▄▂▅▅▄ 1411.318919 \n", "\n", " \n", " sparkline \n", "name \n", "Barton LLC █▄▃▆▄▄▁▁▁▁ \n", "Cronin, Oberbrunner and Spencer █▅▅▃▃▃▂▂▁▁ \n", "Frami, Hills and Schmidt █▅▄▇▅▃▄▁▁▁ \n", "Fritsch, Russel and Anderson ▇█▃▄▂▂▁▂▁▁ \n", "Halvorson, Crona and Champlin ██▆▅▁▃▂▂▂▂ \n", "Herman LLC █▅▇▄▅▄▁▃▂▂ \n", "Jerde-Hilpert █▄▅▂▁▂▃▂▂▁ \n", "Kassulke, Ondricka and Metz █▆▆▄▄▃▂▁▁▂ \n", "Keeling LLC ▅█▆▃▄▂▂▁▁▁ \n", "Kiehn-Spinka █▇▄▃▃▂▁▂▁▁ \n", "Koepp Ltd █▇▅▂▄▂▂▂▁▁ \n", "Kuhn-Gusikowski ▆█▄▃▃▃▃▁▁▁ \n", "Kulas Inc █▅█▂▄▄▄▂▁▁ \n", "Pollich LLC █▆▆▃▃▃▂▂▁▁ \n", "Purdy-Kunde █▅▄▃▄▃▃▂▁▂ \n", "Sanford and Sons ▅▇█▃▃▄▁▃▁▂ \n", "Stokes LLC █▇▆▆▄▂▂▃▁▂ \n", "Trantow-Barrows █▇▅▆▃▂▂▁▁▁ \n", "White-Trantow ▄█▆▅▄▃▄▂▁▃ \n", "Will LLC ▆█▄▅▄▂▁▂▁▂ " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('name')['quantity', 'ext price'].agg(['mean', sparkline_str])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 2 }