In [1]:
%load_ext autoreload
%autoreload 2

In [2]:
from prettypandas import PrettyPandas

In [3]:
import pandas as pd
import numpy as np

np.random.seed(24)
df = pd.DataFrame({'A': np.linspace(1, 10, 10)})
df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))],
               axis=1)

In [4]:
df


Out[4]:
A B C D E
0 1.0 1.329212 -0.770033 -0.316280 -0.990810
1 2.0 -1.070816 -1.438713 0.564417 0.295722
2 3.0 -1.626404 0.219565 0.678805 1.889273
3 4.0 0.961538 0.104011 -0.481165 0.850229
4 5.0 1.453425 1.057737 0.165562 0.515018
5 6.0 -1.336936 0.562861 1.392855 -0.063328
6 7.0 0.121668 1.207603 -0.002040 1.627796
7 8.0 0.354493 1.037528 -0.385684 0.519818
8 9.0 1.686583 -1.325963 1.428984 -2.089354
9 10.0 -0.129820 0.631523 -0.586538 0.290720

Summaries

Supported summaries:

  • total
  • average
  • min
  • max
  • median

In [5]:
df.pipe(PrettyPandas).total(axis=None)


Out[5]:
A B C D E Total
0 1 1.32921 -0.770033 -0.31628 -0.99081 0.252088
1 2 -1.07082 -1.43871 0.564417 0.295722 0.350609
2 3 -1.6264 0.219565 0.678805 1.88927 4.16124
3 4 0.961538 0.104011 -0.481165 0.850229 5.43461
4 5 1.45342 1.05774 0.165562 0.515018 8.19174
5 6 -1.33694 0.562861 1.39285 -0.063328 6.55545
6 7 0.121668 1.2076 -0.00204021 1.6278 9.95503
7 8 0.354493 1.03753 -0.385684 0.519818 9.52615
8 9 1.68658 -1.32596 1.42898 -2.08935 8.70025
9 10 -0.12982 0.631523 -0.586538 0.29072 10.2059
Total 55 1.74294 1.28612 2.45891 2.84508

In [6]:
PrettyPandas(df).total()


Out[6]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 4 0.961538 0.104011 -0.481165 0.850229
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072
Total 55 1.74294 1.28612 2.45891 2.84508

In [7]:
PrettyPandas(df).average()


Out[7]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 4 0.961538 0.104011 -0.481165 0.850229
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072
Average 5.5 0.174294 0.128612 0.245891 0.284508

In [8]:
PrettyPandas(df).average(axis=1)


Out[8]:
A B C D E Average
0 1 1.32921 -0.770033 -0.31628 -0.99081 0.0504176
1 2 -1.07082 -1.43871 0.564417 0.295722 0.0701218
2 3 -1.6264 0.219565 0.678805 1.88927 0.832248
3 4 0.961538 0.104011 -0.481165 0.850229 1.08692
4 5 1.45342 1.05774 0.165562 0.515018 1.63835
5 6 -1.33694 0.562861 1.39285 -0.063328 1.31109
6 7 0.121668 1.2076 -0.00204021 1.6278 1.99101
7 8 0.354493 1.03753 -0.385684 0.519818 1.90523
8 9 1.68658 -1.32596 1.42898 -2.08935 1.74005
9 10 -0.12982 0.631523 -0.586538 0.29072 2.04118

In [9]:
PrettyPandas(df).average(axis=None)


Out[9]:
A B C D E Average
0 1 1.32921 -0.770033 -0.31628 -0.99081 0.0504176
1 2 -1.07082 -1.43871 0.564417 0.295722 0.0701218
2 3 -1.6264 0.219565 0.678805 1.88927 0.832248
3 4 0.961538 0.104011 -0.481165 0.850229 1.08692
4 5 1.45342 1.05774 0.165562 0.515018 1.63835
5 6 -1.33694 0.562861 1.39285 -0.063328 1.31109
6 7 0.121668 1.2076 -0.00204021 1.6278 1.99101
7 8 0.354493 1.03753 -0.385684 0.519818 1.90523
8 9 1.68658 -1.32596 1.42898 -2.08935 1.74005
9 10 -0.12982 0.631523 -0.586538 0.29072 2.04118
Average 5.5 0.174294 0.128612 0.245891 0.284508

In [10]:
PrettyPandas(df).min().max()


Out[10]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 4 0.961538 0.104011 -0.481165 0.850229
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072
Minimum 1 -1.6264 -1.43871 -0.586538 -2.08935
Maximum 10 1.68658 1.2076 1.42898 1.88927

In [11]:
PrettyPandas(df).summary(np.mean, "Average")


Out[11]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 4 0.961538 0.104011 -0.481165 0.850229
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072
Average 5.5 0.174294 0.128612 0.245891 0.284508

In [36]:
def count_greater_than_zero(column):
    return (column > 0).sum()

PrettyPandas(df).summary(count_greater_than_zero, title="> 0")


Out[36]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 4 0.961538 0.104011 -0.481165 0.850229
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072
> 0 10 6 7 5 7

Multiple Summaries


In [13]:
PrettyPandas(df).multi_summary([np.mean, np.sum],
                               ['Average', 'Total'],
                               axis=None)


Out[13]:
A B C D E Average Total
0 1 1.32921 -0.770033 -0.31628 -0.99081 0.0504176 0.252088
1 2 -1.07082 -1.43871 0.564417 0.295722 0.0701218 0.350609
2 3 -1.6264 0.219565 0.678805 1.88927 0.832248 4.16124
3 4 0.961538 0.104011 -0.481165 0.850229 1.08692 5.43461
4 5 1.45342 1.05774 0.165562 0.515018 1.63835 8.19174
5 6 -1.33694 0.562861 1.39285 -0.063328 1.31109 6.55545
6 7 0.121668 1.2076 -0.00204021 1.6278 1.99101 9.95503
7 8 0.354493 1.03753 -0.385684 0.519818 1.90523 9.52615
8 9 1.68658 -1.32596 1.42898 -2.08935 1.74005 8.70025
9 10 -0.12982 0.631523 -0.586538 0.29072 2.04118 10.2059
Average 5.5 0.174294 0.128612 0.245891 0.284508
Total 55 1.74294 1.28612 2.45891 2.84508

Number Formatting


In [15]:
from prettypandas import as_percent, as_currency, as_unit

In [16]:
df.style.format(as_percent(), subset='E')


Out[16]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -99.08%
1 2 -1.07082 -1.43871 0.564417 29.57%
2 3 -1.6264 0.219565 0.678805 188.93%
3 4 0.961538 0.104011 -0.481165 85.02%
4 5 1.45342 1.05774 0.165562 51.50%
5 6 -1.33694 0.562861 1.39285 -6.33%
6 7 0.121668 1.2076 -0.00204021 162.78%
7 8 0.354493 1.03753 -0.385684 51.98%
8 9 1.68658 -1.32596 1.42898 -208.94%
9 10 -0.12982 0.631523 -0.586538 29.07%

In [37]:
PrettyPandas(df).as_percent(subset='A')  # Format just column A


Out[37]:
A B C D E
0 100.00% 1.32921 -0.770033 -0.31628 -0.99081
1 200.00% -1.07082 -1.43871 0.564417 0.295722
2 300.00% -1.6264 0.219565 0.678805 1.88927
3 400.00% 0.961538 0.104011 -0.481165 0.850229
4 500.00% 1.45342 1.05774 0.165562 0.515018
5 600.00% -1.33694 0.562861 1.39285 -0.063328
6 700.00% 0.121668 1.2076 -0.00204021 1.6278
7 800.00% 0.354493 1.03753 -0.385684 0.519818
8 900.00% 1.68658 -1.32596 1.42898 -2.08935
9 1000.00% -0.12982 0.631523 -0.586538 0.29072

In [38]:
PrettyPandas(df).as_percent(subset=['A', 'B'])  # Format columns A and B


Out[38]:
A B C D E
0 100.00% 132.92% -0.770033 -0.31628 -0.99081
1 200.00% -107.08% -1.43871 0.564417 0.295722
2 300.00% -162.64% 0.219565 0.678805 1.88927
3 400.00% 96.15% 0.104011 -0.481165 0.850229
4 500.00% 145.34% 1.05774 0.165562 0.515018
5 600.00% -133.69% 0.562861 1.39285 -0.063328
6 700.00% 12.17% 1.2076 -0.00204021 1.6278
7 800.00% 35.45% 1.03753 -0.385684 0.519818
8 900.00% 168.66% -1.32596 1.42898 -2.08935
9 1000.00% -12.98% 0.631523 -0.586538 0.29072

In [18]:
PrettyPandas(df).as_currency('GBP')


Out[18]:
A B C D E
0 £1.00 £1.33 -£0.77 -£0.32 -£0.99
1 £2.00 -£1.07 -£1.44 £0.56 £0.30
2 £3.00 -£1.63 £0.22 £0.68 £1.89
3 £4.00 £0.96 £0.10 -£0.48 £0.85
4 £5.00 £1.45 £1.06 £0.17 £0.52
5 £6.00 -£1.34 £0.56 £1.39 -£0.06
6 £7.00 £0.12 £1.21 -£0.00 £1.63
7 £8.00 £0.35 £1.04 -£0.39 £0.52
8 £9.00 £1.69 -£1.33 £1.43 -£2.09
9 £10.00 -£0.13 £0.63 -£0.59 £0.29

In [19]:
PrettyPandas(df).as_percent(precision=3)


Out[19]:
A B C D E
0 100.000% 132.921% -77.003% -31.628% -99.081%
1 200.000% -107.082% -143.871% 56.442% 29.572%
2 300.000% -162.640% 21.957% 67.880% 188.927%
3 400.000% 96.154% 10.401% -48.117% 85.023%
4 500.000% 145.342% 105.774% 16.556% 51.502%
5 600.000% -133.694% 56.286% 139.285% -6.333%
6 700.000% 12.167% 120.760% -0.204% 162.780%
7 800.000% 35.449% 103.753% -38.568% 51.982%
8 900.000% 168.658% -132.596% 142.898% -208.935%
9 1000.000% -12.982% 63.152% -58.654% 29.072%

In [20]:
PrettyPandas(df).as_currency(currency="GBP")


Out[20]:
A B C D E
0 £1.00 £1.33 -£0.77 -£0.32 -£0.99
1 £2.00 -£1.07 -£1.44 £0.56 £0.30
2 £3.00 -£1.63 £0.22 £0.68 £1.89
3 £4.00 £0.96 £0.10 -£0.48 £0.85
4 £5.00 £1.45 £1.06 £0.17 £0.52
5 £6.00 -£1.34 £0.56 £1.39 -£0.06
6 £7.00 £0.12 £1.21 -£0.00 £1.63
7 £8.00 £0.35 £1.04 -£0.39 £0.52
8 £9.00 £1.69 -£1.33 £1.43 -£2.09
9 £10.00 -£0.13 £0.63 -£0.59 £0.29

In [21]:
PrettyPandas(df).as_unit(' mol', location='suffix')


Out[21]:
A B C D E
0 1.00 mol 1.33 mol -0.77 mol -0.32 mol -0.99 mol
1 2.00 mol -1.07 mol -1.44 mol 0.56 mol 0.30 mol
2 3.00 mol -1.63 mol 0.22 mol 0.68 mol 1.89 mol
3 4.00 mol 0.96 mol 0.10 mol -0.48 mol 0.85 mol
4 5.00 mol 1.45 mol 1.06 mol 0.17 mol 0.52 mol
5 6.00 mol -1.34 mol 0.56 mol 1.39 mol -0.06 mol
6 7.00 mol 0.12 mol 1.21 mol -0.00 mol 1.63 mol
7 8.00 mol 0.35 mol 1.04 mol -0.39 mol 0.52 mol
8 9.00 mol 1.69 mol -1.33 mol 1.43 mol -2.09 mol
9 10.00 mol -0.13 mol 0.63 mol -0.59 mol 0.29 mol

In [22]:
PrettyPandas(df).as_percent(subset=['B'])


Out[22]:
A B C D E
0 1 132.92% -0.770033 -0.31628 -0.99081
1 2 -107.08% -1.43871 0.564417 0.295722
2 3 -162.64% 0.219565 0.678805 1.88927
3 4 96.15% 0.104011 -0.481165 0.850229
4 5 145.34% 1.05774 0.165562 0.515018
5 6 -133.69% 0.562861 1.39285 -0.063328
6 7 12.17% 1.2076 -0.00204021 1.6278
7 8 35.45% 1.03753 -0.385684 0.519818
8 9 168.66% -1.32596 1.42898 -2.08935
9 10 -12.98% 0.631523 -0.586538 0.29072

In [23]:
PrettyPandas(df).as_percent(subset=['B']).total()


Out[23]:
A B C D E
0 1 132.92% -0.770033 -0.31628 -0.99081
1 2 -107.08% -1.43871 0.564417 0.295722
2 3 -162.64% 0.219565 0.678805 1.88927
3 4 96.15% 0.104011 -0.481165 0.850229
4 5 145.34% 1.05774 0.165562 0.515018
5 6 -133.69% 0.562861 1.39285 -0.063328
6 7 12.17% 1.2076 -0.00204021 1.6278
7 8 35.45% 1.03753 -0.385684 0.519818
8 9 168.66% -1.32596 1.42898 -2.08935
9 10 -12.98% 0.631523 -0.586538 0.29072
Total 55 174.29% 1.28612 2.45891 2.84508

In [65]:
(
    df.pipe(PrettyPandas)
    .as_percent(precision=0)
    .median()
    .style
    .background_gradient()
)


Out[65]:
A B C D E
0 100% 133% -77% -32% -99%
1 200% -107% -144% 56% 30%
2 300% -163% 22% 68% 189%
3 400% 96% 10% -48% 85%
4 500% 145% 106% 17% 52%
5 600% -134% 56% 139% -6%
6 700% 12% 121% -0% 163%
7 800% 35% 104% -39% 52%
8 900% 169% -133% 143% -209%
9 1000% -13% 63% -59% 29%
Median 550% 24% 39% 8% 41%

In [40]:
PrettyPandas(df).as_percent(subset=pd.IndexSlice[3,:], precision=2)


Out[40]:
A B C D E
0 1 1.32921 -0.770033 -0.31628 -0.99081
1 2 -1.07082 -1.43871 0.564417 0.295722
2 3 -1.6264 0.219565 0.678805 1.88927
3 400.00% 96.15% 10.40% -48.12% 85.02%
4 5 1.45342 1.05774 0.165562 0.515018
5 6 -1.33694 0.562861 1.39285 -0.063328
6 7 0.121668 1.2076 -0.00204021 1.6278
7 8 0.354493 1.03753 -0.385684 0.519818
8 9 1.68658 -1.32596 1.42898 -2.08935
9 10 -0.12982 0.631523 -0.586538 0.29072

In [52]:
first_row_idx = pd.IndexSlice[0, :]
second_row_idx = pd.IndexSlice[1, :]

(
    df.pipe(PrettyPandas)
    .as_currency(subset=first_row_idx)
    .as_percent(subset=second_row_idx)
    .total(axis=1)
)


Out[52]:
A B C D E Total
0 $1.00 $1.33 -$0.77 -$0.32 -$0.99 $0.25
1 200.00% -107.08% -143.87% 56.44% 29.57% 35.06%
2 3 -1.6264 0.219565 0.678805 1.88927 4.16124
3 4 0.961538 0.104011 -0.481165 0.850229 5.43461
4 5 1.45342 1.05774 0.165562 0.515018 8.19174
5 6 -1.33694 0.562861 1.39285 -0.063328 6.55545
6 7 0.121668 1.2076 -0.00204021 1.6278 9.95503
7 8 0.354493 1.03753 -0.385684 0.519818 9.52615
8 9 1.68658 -1.32596 1.42898 -2.08935 8.70025
9 10 -0.12982 0.631523 -0.586538 0.29072 10.2059

In [31]:
(
    df
    .pipe(PrettyPandas)
    .as_currency('GBP', subset='A')
    .as_percent(subset='B')
    .total()
    .average()
)


Out[31]:
A B C D E
0 £1.00 132.92% -0.770033 -0.31628 -0.99081
1 £2.00 -107.08% -1.43871 0.564417 0.295722
2 £3.00 -162.64% 0.219565 0.678805 1.88927
3 £4.00 96.15% 0.104011 -0.481165 0.850229
4 £5.00 145.34% 1.05774 0.165562 0.515018
5 £6.00 -133.69% 0.562861 1.39285 -0.063328
6 £7.00 12.17% 1.2076 -0.00204021 1.6278
7 £8.00 35.45% 1.03753 -0.385684 0.519818
8 £9.00 168.66% -1.32596 1.42898 -2.08935
9 £10.00 -12.98% 0.631523 -0.586538 0.29072
Total £55.00 174.29% 1.28612 2.45891 2.84508
Average £5.50 17.43% 0.128612 0.245891 0.284508

In [59]:
(
    df
    .pipe(PrettyPandas)
    .total(axis=1)
    .to_frame()
)


Out[59]:
A B C D E Total
0 1.0 1.329212 -0.770033 -0.316280 -0.990810 0.252088
1 2.0 -1.070816 -1.438713 0.564417 0.295722 0.350609
2 3.0 -1.626404 0.219565 0.678805 1.889273 4.161238
3 4.0 0.961538 0.104011 -0.481165 0.850229 5.434613
4 5.0 1.453425 1.057737 0.165562 0.515018 8.191742
5 6.0 -1.336936 0.562861 1.392855 -0.063328 6.555452
6 7.0 0.121668 1.207603 -0.002040 1.627796 9.955026
7 8.0 0.354493 1.037528 -0.385684 0.519818 9.526155
8 9.0 1.686583 -1.325963 1.428984 -2.089354 8.700249
9 10.0 -0.129820 0.631523 -0.586538 0.290720 10.205885