Option A
You can use the border-collapse
CSS property with the .render()
method from the Styler
object.
[for Pandas >= 1.4
use Styler.to_html()
]
You pass the borders style with .style.set_table_styles()
.
Example that works on Pandas 1.1.3
:
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
dh = df.head()
borders = [{
'selector': 'td, th, table'
, 'props' : [ ('border', '1px solid lightgrey')
, ('border-collapse', 'collapse')
]
}]
html_fragment = dh.style.hide_index().set_table_styles(borders).render()
html_fragment
renders to:
<style type="text/css" >
#T_da4a1131_90ff_11ec_9603_dcfb48c86a17 td, th, table {
border: 1px solid lightgrey;
border-collapse: collapse;
}</style><table id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17" ><thead> <tr> <th class="col_heading level0 col0" >sepal length (cm)</th> <th class="col_heading level0 col1" >sepal width (cm)</th> <th class="col_heading level0 col2" >petal length (cm)</th> <th class="col_heading level0 col3" >petal width (cm)</th> </tr></thead><tbody>
<tr>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row0_col0" class="data row0 col0" >5.100000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row0_col1" class="data row0 col1" >3.500000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row0_col2" class="data row0 col2" >1.400000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row0_col3" class="data row0 col3" >0.200000</td>
</tr>
<tr>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row1_col0" class="data row1 col0" >4.900000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row1_col1" class="data row1 col1" >3.000000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row1_col2" class="data row1 col2" >1.400000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row1_col3" class="data row1 col3" >0.200000</td>
</tr>
<tr>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row2_col0" class="data row2 col0" >4.700000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row2_col1" class="data row2 col1" >3.200000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row2_col2" class="data row2 col2" >1.300000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row2_col3" class="data row2 col3" >0.200000</td>
</tr>
<tr>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row3_col0" class="data row3 col0" >4.600000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row3_col1" class="data row3 col1" >3.100000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row3_col2" class="data row3 col2" >1.500000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row3_col3" class="data row3 col3" >0.200000</td>
</tr>
<tr>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row4_col0" class="data row4 col0" >5.000000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row4_col1" class="data row4 col1" >3.600000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row4_col2" class="data row4 col2" >1.400000</td>
<td id="T_da4a1131_90ff_11ec_9603_dcfb48c86a17row4_col3" class="data row4 col3" >0.200000</td>
</tr>
</tbody></table>
which gets displayed as (on Chromium 85.0
):

Note that the syntax for passing style properties in later versions for Pandas has slightly changed.
Option B
In case you want something quicker without tinkering too much with CSS, you can use:
.to_html(border=0)
from the DataFrame object, which sets <table border="0" >
.
Using the code above:
html_pure = dh.to_html(border=0, index=False)
which renders as:
<table border="2" class="dataframe">\n <thead>\n <tr style="text-align: right;">\n <th>sepal length (cm)</th>\n <th>sepal width (cm)</th>\n <th>petal length (cm)</th>\n <th>petal width (cm)</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>5.1</td>\n <td>3.5</td>\n <td>1.4</td>\n <td>0.2</td>\n </tr>\n <tr>\n <td>4.9</td>\n <td>3.0</td>\n <td>1.4</td>\n <td>0.2</td>\n </tr>\n <tr>\n <td>4.7</td>\n <td>3.2</td>\n <td>1.3</td>\n <td>0.2</td>\n </tr>\n <tr>\n <td>4.6</td>\n <td>3.1</td>\n <td>1.5</td>\n <td>0.2</td>\n </tr>\n <tr>\n <td>5.0</td>\n <td>3.6</td>\n <td>1.4</td>\n <td>0.2</td>\n </tr>\n </tbody>\n</table>
and is useful if you want to style your tables externally and without having too much generated clutter in your table html code.
html_pure
displays like:

LBNL, tables and style properties have always been tricky.
You may want to spend some time with the html inspector inside your browser to see what's really happening.
The code above works generally fine on a pretty good array of (modern) browsers/applications.