Note
Click here to download the full example code
01. A basic TableOne demonstration
This script provides a practical demonstration of the tableone Python library, a tool designed to easily create the table of descriptive statistics commonly found in medical and scientific research papers. Using the well-known primary biliary cirrhosis (pbc) dataset, it walks through the essential steps of data preparation, including specifying continuous, categorical, and non-normally distributed variables. The script then generates a summary table, grouped by a treatment variable, and showcases the library’s versatility by exporting the table to various formats, including HTML, GitHub-flavored Markdown, LaTeX, and Microsoft Excel.
17 # Libraries
18 import pandas as pd
19
20 from tableone import TableOne
21
22 # Load data
23 url="https://raw.githubusercontent.com/tompollard/data/master/primary-biliary-cirrhosis/pbc.csv"
24 data=pd.read_csv(url)
25
26 # List of columns
27 columns = [
28 'age', 'bili', 'albumin', 'ast',
29 'platelet', 'protime', 'ascites',
30 'hepato', 'spiders', 'edema', 'sex',
31 'trt'
32 ]
33
34 # Specify categorical columns
35 categorical = ['ascites','hepato','edema','sex','spiders','trt']
36
37 # Define groupby and not normal
38 groupby = 'trt'
39 nonnormal = ['bili']
40
41 # Create descriptive table
42 mytable = TableOne(data, columns=columns, categorical=categorical,
43 groupby=groupby, nonnormal=nonnormal, pval=True)
Out:
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\tableone\statistics.py:160: UserWarning:
No P-Value was computed for ast due to the low number of observations.
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\numpy\lib\nanfunctions.py:1879: RuntimeWarning:
Degrees of freedom <= 0 for slice.
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\numpy\lib\nanfunctions.py:1384: RuntimeWarning:
All-NaN slice encountered
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\numpy\lib\nanfunctions.py:1384: RuntimeWarning:
All-NaN slice encountered
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\tableone\tableone.py:596: RuntimeWarning:
Mean of empty slice
C:\Users\kelda\Desktop\repositories\virtualenvs\venv-py311-psc\Lib\site-packages\numpy\lib\nanfunctions.py:1879: RuntimeWarning:
Degrees of freedom <= 0 for slice.
47 mytable.tableone
Convert to html
51 html = mytable.to_html()
52 html
Out:
'<table border="1" class="dataframe">\n <thead>\n <tr>\n <th></th>\n <th></th>\n <th colspan="6" halign="left">Grouped by trt</th>\n </tr>\n <tr>\n <th></th>\n <th></th>\n <th>Missing</th>\n <th>Overall</th>\n <th>1.0</th>\n <th>2.0</th>\n <th>None</th>\n <th>P-Value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>n</th>\n <th></th>\n <td></td>\n <td>418</td>\n <td>158</td>\n <td>154</td>\n <td>106</td>\n <td></td>\n </tr>\n <tr>\n <th>age, mean (SD)</th>\n <th></th>\n <td>0</td>\n <td>50.7 (10.4)</td>\n <td>51.4 (11.0)</td>\n <td>48.6 (10.0)</td>\n <td>52.9 (9.8)</td>\n <td>0.003</td>\n </tr>\n <tr>\n <th>bili, median [Q1,Q3]</th>\n <th></th>\n <td>0</td>\n <td>1.4 [0.8,3.4]</td>\n <td>1.4 [0.8,3.2]</td>\n <td>1.3 [0.7,3.6]</td>\n <td>1.4 [0.7,3.1]</td>\n <td>0.972</td>\n </tr>\n <tr>\n <th>albumin, mean (SD)</th>\n <th></th>\n <td>0</td>\n <td>3.5 (0.4)</td>\n <td>3.5 (0.4)</td>\n <td>3.5 (0.4)</td>\n <td>3.4 (0.4)</td>\n <td>0.175</td>\n </tr>\n <tr>\n <th>ast, mean (SD)</th>\n <th></th>\n <td>106</td>\n <td>122.6 (56.7)</td>\n <td>120.2 (54.5)</td>\n <td>125.0 (58.9)</td>\n <td>nan (nan)</td>\n <td></td>\n </tr>\n <tr>\n <th>platelet, mean (SD)</th>\n <th></th>\n <td>11</td>\n <td>257.0 (98.3)</td>\n <td>258.8 (100.3)</td>\n <td>265.2 (90.7)</td>\n <td>241.7 (105.4)</td>\n <td>0.175</td>\n </tr>\n <tr>\n <th>protime, mean (SD)</th>\n <th></th>\n <td>2</td>\n <td>10.7 (1.0)</td>\n <td>10.7 (0.9)</td>\n <td>10.8 (1.1)</td>\n <td>10.8 (1.1)</td>\n <td>0.438</td>\n </tr>\n <tr>\n <th rowspan="3" valign="top">ascites, n (%)</th>\n <th>0.0</th>\n <td></td>\n <td>288 (68.9)</td>\n <td>144 (91.1)</td>\n <td>144 (93.5)</td>\n <td>0 (0.0)</td>\n <td><0.001</td>\n </tr>\n <tr>\n <th>1.0</th>\n <td></td>\n <td>24 (5.7)</td>\n <td>14 (8.9)</td>\n <td>10 (6.5)</td>\n <td>0 (0.0)</td>\n <td></td>\n </tr>\n <tr>\n <th>None</th>\n <td></td>\n <td>106 (25.4)</td>\n <td>0 (0.0)</td>\n <td>0 (0.0)</td>\n <td>106 (100.0)</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan="3" valign="top">hepato, n (%)</th>\n <th>0.0</th>\n <td></td>\n <td>152 (36.4)</td>\n <td>85 (53.8)</td>\n <td>67 (43.5)</td>\n <td>0 (0.0)</td>\n <td><0.001</td>\n </tr>\n <tr>\n <th>1.0</th>\n <td></td>\n <td>160 (38.3)</td>\n <td>73 (46.2)</td>\n <td>87 (56.5)</td>\n <td>0 (0.0)</td>\n <td></td>\n </tr>\n <tr>\n <th>None</th>\n <td></td>\n <td>106 (25.4)</td>\n <td>0 (0.0)</td>\n <td>0 (0.0)</td>\n <td>106 (100.0)</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan="3" valign="top">spiders, n (%)</th>\n <th>0.0</th>\n <td></td>\n <td>222 (53.1)</td>\n <td>113 (71.5)</td>\n <td>109 (70.8)</td>\n <td>0 (0.0)</td>\n <td><0.001</td>\n </tr>\n <tr>\n <th>1.0</th>\n <td></td>\n <td>90 (21.5)</td>\n <td>45 (28.5)</td>\n <td>45 (29.2)</td>\n <td>0 (0.0)</td>\n <td></td>\n </tr>\n <tr>\n <th>None</th>\n <td></td>\n <td>106 (25.4)</td>\n <td>0 (0.0)</td>\n <td>0 (0.0)</td>\n <td>106 (100.0)</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan="3" valign="top">edema, n (%)</th>\n <th>0.0</th>\n <td></td>\n <td>354 (84.7)</td>\n <td>132 (83.5)</td>\n <td>131 (85.1)</td>\n <td>91 (85.8)</td>\n <td>0.066</td>\n </tr>\n <tr>\n <th>0.5</th>\n <td></td>\n <td>44 (10.5)</td>\n <td>16 (10.1)</td>\n <td>13 (8.4)</td>\n <td>15 (14.2)</td>\n <td></td>\n </tr>\n <tr>\n <th>1.0</th>\n <td></td>\n <td>20 (4.8)</td>\n <td>10 (6.3)</td>\n <td>10 (6.5)</td>\n <td>0 (0.0)</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan="2" valign="top">sex, n (%)</th>\n <th>f</th>\n <td></td>\n <td>374 (89.5)</td>\n <td>137 (86.7)</td>\n <td>139 (90.3)</td>\n <td>98 (92.5)</td>\n <td>0.304</td>\n </tr>\n <tr>\n <th>m</th>\n <td></td>\n <td>44 (10.5)</td>\n <td>21 (13.3)</td>\n <td>15 (9.7)</td>\n <td>8 (7.5)</td>\n <td></td>\n </tr>\n <tr>\n <th rowspan="3" valign="top">trt, n (%)</th>\n <th>1.0</th>\n <td></td>\n <td>158 (37.8)</td>\n <td>158 (100.0)</td>\n <td>0 (0.0)</td>\n <td>0 (0.0)</td>\n <td><0.001</td>\n </tr>\n <tr>\n <th>2.0</th>\n <td></td>\n <td>154 (36.8)</td>\n <td>0 (0.0)</td>\n <td>154 (100.0)</td>\n <td>0 (0.0)</td>\n <td></td>\n </tr>\n <tr>\n <th>None</th>\n <td></td>\n <td>106 (25.4)</td>\n <td>0 (0.0)</td>\n <td>0 (0.0)</td>\n <td>106 (100.0)</td>\n <td></td>\n </tr>\n </tbody>\n</table>'
Lets tabulate for github.
56 print(mytable.tabulate(tablefmt="github"))
Out:
| | | Missing | Overall | 1.0 | 2.0 | None | P-Value |
|----------------------|------|-----------|---------------|---------------|---------------|---------------|-----------|
| n | | | 418 | 158 | 154 | 106 | |
| age, mean (SD) | | 0 | 50.7 (10.4) | 51.4 (11.0) | 48.6 (10.0) | 52.9 (9.8) | 0.003 |
| bili, median [Q1,Q3] | | 0 | 1.4 [0.8,3.4] | 1.4 [0.8,3.2] | 1.3 [0.7,3.6] | 1.4 [0.7,3.1] | 0.972 |
| albumin, mean (SD) | | 0 | 3.5 (0.4) | 3.5 (0.4) | 3.5 (0.4) | 3.4 (0.4) | 0.175 |
| ast, mean (SD) | | 106 | 122.6 (56.7) | 120.2 (54.5) | 125.0 (58.9) | nan (nan) | |
| platelet, mean (SD) | | 11 | 257.0 (98.3) | 258.8 (100.3) | 265.2 (90.7) | 241.7 (105.4) | 0.175 |
| protime, mean (SD) | | 2 | 10.7 (1.0) | 10.7 (0.9) | 10.8 (1.1) | 10.8 (1.1) | 0.438 |
| ascites, n (%) | 0.0 | | 288 (68.9) | 144 (91.1) | 144 (93.5) | 0 (0.0) | <0.001 |
| | 1.0 | | 24 (5.7) | 14 (8.9) | 10 (6.5) | 0 (0.0) | |
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
| hepato, n (%) | 0.0 | | 152 (36.4) | 85 (53.8) | 67 (43.5) | 0 (0.0) | <0.001 |
| | 1.0 | | 160 (38.3) | 73 (46.2) | 87 (56.5) | 0 (0.0) | |
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
| spiders, n (%) | 0.0 | | 222 (53.1) | 113 (71.5) | 109 (70.8) | 0 (0.0) | <0.001 |
| | 1.0 | | 90 (21.5) | 45 (28.5) | 45 (29.2) | 0 (0.0) | |
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
| edema, n (%) | 0.0 | | 354 (84.7) | 132 (83.5) | 131 (85.1) | 91 (85.8) | 0.066 |
| | 0.5 | | 44 (10.5) | 16 (10.1) | 13 (8.4) | 15 (14.2) | |
| | 1.0 | | 20 (4.8) | 10 (6.3) | 10 (6.5) | 0 (0.0) | |
| sex, n (%) | f | | 374 (89.5) | 137 (86.7) | 139 (90.3) | 98 (92.5) | 0.304 |
| | m | | 44 (10.5) | 21 (13.3) | 15 (9.7) | 8 (7.5) | |
| trt, n (%) | 1.0 | | 158 (37.8) | 158 (100.0) | 0 (0.0) | 0 (0.0) | <0.001 |
| | 2.0 | | 154 (36.8) | 0 (0.0) | 154 (100.0) | 0 (0.0) | |
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
Lets tabulate for latex.
60 print(mytable.tabulate(tablefmt="latex"))
Out:
\begin{tabular}{llllllll}
\hline
& & Missing & Overall & 1.0 & 2.0 & None & P-Value \\
\hline
n & & & 418 & 158 & 154 & 106 & \\
age, mean (SD) & & 0 & 50.7 (10.4) & 51.4 (11.0) & 48.6 (10.0) & 52.9 (9.8) & 0.003 \\
bili, median [Q1,Q3] & & 0 & 1.4 [0.8,3.4] & 1.4 [0.8,3.2] & 1.3 [0.7,3.6] & 1.4 [0.7,3.1] & 0.972 \\
albumin, mean (SD) & & 0 & 3.5 (0.4) & 3.5 (0.4) & 3.5 (0.4) & 3.4 (0.4) & 0.175 \\
ast, mean (SD) & & 106 & 122.6 (56.7) & 120.2 (54.5) & 125.0 (58.9) & nan (nan) & \\
platelet, mean (SD) & & 11 & 257.0 (98.3) & 258.8 (100.3) & 265.2 (90.7) & 241.7 (105.4) & 0.175 \\
protime, mean (SD) & & 2 & 10.7 (1.0) & 10.7 (0.9) & 10.8 (1.1) & 10.8 (1.1) & 0.438 \\
ascites, n (\%) & 0.0 & & 288 (68.9) & 144 (91.1) & 144 (93.5) & 0 (0.0) & \ensuremath{<}0.001 \\
& 1.0 & & 24 (5.7) & 14 (8.9) & 10 (6.5) & 0 (0.0) & \\
& None & & 106 (25.4) & 0 (0.0) & 0 (0.0) & 106 (100.0) & \\
hepato, n (\%) & 0.0 & & 152 (36.4) & 85 (53.8) & 67 (43.5) & 0 (0.0) & \ensuremath{<}0.001 \\
& 1.0 & & 160 (38.3) & 73 (46.2) & 87 (56.5) & 0 (0.0) & \\
& None & & 106 (25.4) & 0 (0.0) & 0 (0.0) & 106 (100.0) & \\
spiders, n (\%) & 0.0 & & 222 (53.1) & 113 (71.5) & 109 (70.8) & 0 (0.0) & \ensuremath{<}0.001 \\
& 1.0 & & 90 (21.5) & 45 (28.5) & 45 (29.2) & 0 (0.0) & \\
& None & & 106 (25.4) & 0 (0.0) & 0 (0.0) & 106 (100.0) & \\
edema, n (\%) & 0.0 & & 354 (84.7) & 132 (83.5) & 131 (85.1) & 91 (85.8) & 0.066 \\
& 0.5 & & 44 (10.5) & 16 (10.1) & 13 (8.4) & 15 (14.2) & \\
& 1.0 & & 20 (4.8) & 10 (6.3) & 10 (6.5) & 0 (0.0) & \\
sex, n (\%) & f & & 374 (89.5) & 137 (86.7) & 139 (90.3) & 98 (92.5) & 0.304 \\
& m & & 44 (10.5) & 21 (13.3) & 15 (9.7) & 8 (7.5) & \\
trt, n (\%) & 1.0 & & 158 (37.8) & 158 (100.0) & 0 (0.0) & 0 (0.0) & \ensuremath{<}0.001 \\
& 2.0 & & 154 (36.8) & 0 (0.0) & 154 (100.0) & 0 (0.0) & \\
& None & & 106 (25.4) & 0 (0.0) & 0 (0.0) & 106 (100.0) & \\
\hline
\end{tabular}
Lets tabulate for grid.
64 print(mytable.tabulate(tablefmt="grid"))
Out:
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | | Missing | Overall | 1.0 | 2.0 | None | P-Value |
+======================+======+===========+===============+===============+===============+===============+===========+
| n | | | 418 | 158 | 154 | 106 | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| age, mean (SD) | | 0 | 50.7 (10.4) | 51.4 (11.0) | 48.6 (10.0) | 52.9 (9.8) | 0.003 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| bili, median [Q1,Q3] | | 0 | 1.4 [0.8,3.4] | 1.4 [0.8,3.2] | 1.3 [0.7,3.6] | 1.4 [0.7,3.1] | 0.972 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| albumin, mean (SD) | | 0 | 3.5 (0.4) | 3.5 (0.4) | 3.5 (0.4) | 3.4 (0.4) | 0.175 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| ast, mean (SD) | | 106 | 122.6 (56.7) | 120.2 (54.5) | 125.0 (58.9) | nan (nan) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| platelet, mean (SD) | | 11 | 257.0 (98.3) | 258.8 (100.3) | 265.2 (90.7) | 241.7 (105.4) | 0.175 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| protime, mean (SD) | | 2 | 10.7 (1.0) | 10.7 (0.9) | 10.8 (1.1) | 10.8 (1.1) | 0.438 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| ascites, n (%) | 0.0 | | 288 (68.9) | 144 (91.1) | 144 (93.5) | 0 (0.0) | <0.001 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 1.0 | | 24 (5.7) | 14 (8.9) | 10 (6.5) | 0 (0.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| hepato, n (%) | 0.0 | | 152 (36.4) | 85 (53.8) | 67 (43.5) | 0 (0.0) | <0.001 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 1.0 | | 160 (38.3) | 73 (46.2) | 87 (56.5) | 0 (0.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| spiders, n (%) | 0.0 | | 222 (53.1) | 113 (71.5) | 109 (70.8) | 0 (0.0) | <0.001 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 1.0 | | 90 (21.5) | 45 (28.5) | 45 (29.2) | 0 (0.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| edema, n (%) | 0.0 | | 354 (84.7) | 132 (83.5) | 131 (85.1) | 91 (85.8) | 0.066 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 0.5 | | 44 (10.5) | 16 (10.1) | 13 (8.4) | 15 (14.2) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 1.0 | | 20 (4.8) | 10 (6.3) | 10 (6.5) | 0 (0.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| sex, n (%) | f | | 374 (89.5) | 137 (86.7) | 139 (90.3) | 98 (92.5) | 0.304 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | m | | 44 (10.5) | 21 (13.3) | 15 (9.7) | 8 (7.5) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| trt, n (%) | 1.0 | | 158 (37.8) | 158 (100.0) | 0 (0.0) | 0 (0.0) | <0.001 |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | 2.0 | | 154 (36.8) | 0 (0.0) | 154 (100.0) | 0 (0.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
| | None | | 106 (25.4) | 0 (0.0) | 0 (0.0) | 106 (100.0) | |
+----------------------+------+-----------+---------------+---------------+---------------+---------------+-----------+
Lets tabulate for fancy grid.
68 print(mytable.tabulate(tablefmt="fancy_grid"))
Out:
╒══════════════════════╤══════╤═══════════╤═══════════════╤═══════════════╤═══════════════╤═══════════════╤═══════════╕
│ │ │ Missing │ Overall │ 1.0 │ 2.0 │ None │ P-Value │
╞══════════════════════╪══════╪═══════════╪═══════════════╪═══════════════╪═══════════════╪═══════════════╪═══════════╡
│ n │ │ │ 418 │ 158 │ 154 │ 106 │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ age, mean (SD) │ │ 0 │ 50.7 (10.4) │ 51.4 (11.0) │ 48.6 (10.0) │ 52.9 (9.8) │ 0.003 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ bili, median [Q1,Q3] │ │ 0 │ 1.4 [0.8,3.4] │ 1.4 [0.8,3.2] │ 1.3 [0.7,3.6] │ 1.4 [0.7,3.1] │ 0.972 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ albumin, mean (SD) │ │ 0 │ 3.5 (0.4) │ 3.5 (0.4) │ 3.5 (0.4) │ 3.4 (0.4) │ 0.175 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ ast, mean (SD) │ │ 106 │ 122.6 (56.7) │ 120.2 (54.5) │ 125.0 (58.9) │ nan (nan) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ platelet, mean (SD) │ │ 11 │ 257.0 (98.3) │ 258.8 (100.3) │ 265.2 (90.7) │ 241.7 (105.4) │ 0.175 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ protime, mean (SD) │ │ 2 │ 10.7 (1.0) │ 10.7 (0.9) │ 10.8 (1.1) │ 10.8 (1.1) │ 0.438 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ ascites, n (%) │ 0.0 │ │ 288 (68.9) │ 144 (91.1) │ 144 (93.5) │ 0 (0.0) │ <0.001 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 1.0 │ │ 24 (5.7) │ 14 (8.9) │ 10 (6.5) │ 0 (0.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ None │ │ 106 (25.4) │ 0 (0.0) │ 0 (0.0) │ 106 (100.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ hepato, n (%) │ 0.0 │ │ 152 (36.4) │ 85 (53.8) │ 67 (43.5) │ 0 (0.0) │ <0.001 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 1.0 │ │ 160 (38.3) │ 73 (46.2) │ 87 (56.5) │ 0 (0.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ None │ │ 106 (25.4) │ 0 (0.0) │ 0 (0.0) │ 106 (100.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ spiders, n (%) │ 0.0 │ │ 222 (53.1) │ 113 (71.5) │ 109 (70.8) │ 0 (0.0) │ <0.001 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 1.0 │ │ 90 (21.5) │ 45 (28.5) │ 45 (29.2) │ 0 (0.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ None │ │ 106 (25.4) │ 0 (0.0) │ 0 (0.0) │ 106 (100.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ edema, n (%) │ 0.0 │ │ 354 (84.7) │ 132 (83.5) │ 131 (85.1) │ 91 (85.8) │ 0.066 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 0.5 │ │ 44 (10.5) │ 16 (10.1) │ 13 (8.4) │ 15 (14.2) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 1.0 │ │ 20 (4.8) │ 10 (6.3) │ 10 (6.5) │ 0 (0.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ sex, n (%) │ f │ │ 374 (89.5) │ 137 (86.7) │ 139 (90.3) │ 98 (92.5) │ 0.304 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ m │ │ 44 (10.5) │ 21 (13.3) │ 15 (9.7) │ 8 (7.5) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ trt, n (%) │ 1.0 │ │ 158 (37.8) │ 158 (100.0) │ 0 (0.0) │ 0 (0.0) │ <0.001 │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ 2.0 │ │ 154 (36.8) │ 0 (0.0) │ 154 (100.0) │ 0 (0.0) │ │
├──────────────────────┼──────┼───────────┼───────────────┼───────────────┼───────────────┼───────────────┼───────────┤
│ │ None │ │ 106 (25.4) │ 0 (0.0) │ 0 (0.0) │ 106 (100.0) │ │
╘══════════════════════╧══════╧═══════════╧═══════════════╧═══════════════╧═══════════════╧═══════════════╧═══════════╛
Lets tabulate for markdown
72 print(mytable.tabulate(tablefmt="rst"))
Out:
==================== ==== ========= ============= ============= ============= ============= =========
.. Missing Overall 1.0 2.0 None P-Value
==================== ==== ========= ============= ============= ============= ============= =========
n 418 158 154 106
age, mean (SD) 0 50.7 (10.4) 51.4 (11.0) 48.6 (10.0) 52.9 (9.8) 0.003
bili, median [Q1,Q3] 0 1.4 [0.8,3.4] 1.4 [0.8,3.2] 1.3 [0.7,3.6] 1.4 [0.7,3.1] 0.972
albumin, mean (SD) 0 3.5 (0.4) 3.5 (0.4) 3.5 (0.4) 3.4 (0.4) 0.175
ast, mean (SD) 106 122.6 (56.7) 120.2 (54.5) 125.0 (58.9) nan (nan)
platelet, mean (SD) 11 257.0 (98.3) 258.8 (100.3) 265.2 (90.7) 241.7 (105.4) 0.175
protime, mean (SD) 2 10.7 (1.0) 10.7 (0.9) 10.8 (1.1) 10.8 (1.1) 0.438
ascites, n (%) 0.0 288 (68.9) 144 (91.1) 144 (93.5) 0 (0.0) <0.001
.. 1.0 24 (5.7) 14 (8.9) 10 (6.5) 0 (0.0)
.. None 106 (25.4) 0 (0.0) 0 (0.0) 106 (100.0)
hepato, n (%) 0.0 152 (36.4) 85 (53.8) 67 (43.5) 0 (0.0) <0.001
.. 1.0 160 (38.3) 73 (46.2) 87 (56.5) 0 (0.0)
.. None 106 (25.4) 0 (0.0) 0 (0.0) 106 (100.0)
spiders, n (%) 0.0 222 (53.1) 113 (71.5) 109 (70.8) 0 (0.0) <0.001
.. 1.0 90 (21.5) 45 (28.5) 45 (29.2) 0 (0.0)
.. None 106 (25.4) 0 (0.0) 0 (0.0) 106 (100.0)
edema, n (%) 0.0 354 (84.7) 132 (83.5) 131 (85.1) 91 (85.8) 0.066
.. 0.5 44 (10.5) 16 (10.1) 13 (8.4) 15 (14.2)
.. 1.0 20 (4.8) 10 (6.3) 10 (6.5) 0 (0.0)
sex, n (%) f 374 (89.5) 137 (86.7) 139 (90.3) 98 (92.5) 0.304
.. m 44 (10.5) 21 (13.3) 15 (9.7) 8 (7.5)
trt, n (%) 1.0 158 (37.8) 158 (100.0) 0 (0.0) 0 (0.0) <0.001
.. 2.0 154 (36.8) 0 (0.0) 154 (100.0) 0 (0.0)
.. None 106 (25.4) 0 (0.0) 0 (0.0) 106 (100.0)
==================== ==== ========= ============= ============= ============= ============= =========
Lets create the outputs folder
76 from pathlib import Path
77 folder_path = Path("./outputs")
78 folder_path.mkdir(parents=True, exist_ok=True)
79 print(f"Folder '{folder_path}' is ready.")
80
81 # Save as latex file
82 mytable.to_latex(folder_path / 'main01-mytable.tex')
Out:
Folder 'outputs' is ready.
Save as xls file
86 mytable.to_excel(folder_path / 'main01-mytable.xlsx')
Total running time of the script: ( 0 minutes 0.575 seconds)