I am trying to save defined in Python Pandas Data Frame
as HTML
page. In addition i would like to make this table saved as HTML
table ability to be filtered by value of any column. Can you please provide possible solution? At the final this should be table saved as HTML
page. I would like to incorporate this code in my Python
code. Thank you
Asked
Active
Viewed 5.8k times
39

Reza Rahemtola
- 1,182
- 7
- 16
- 30

Felix
- 1,539
- 8
- 20
- 35
3 Answers
60
You can use pandas.DataFrame.to_html()
.
Example:
>>> import numpy as np
>>> from pandas import *
>>> df = DataFrame({'foo1' : np.random.randn(2),
'foo2' : np.random.randn(2)})
>>> df.to_html('filename.html')
This will save the following html to filename.html
.
Output:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>foo1</th>
<th>foo2</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>-0.223430</td>
<td>-0.904465</td>
</tr>
<tr>
<th>1</th>
<td>0.317316</td>
<td>1.321537</td>
</tr>
</tbody>
</table>
-
Thank you. And in case i would like to save this HTML webpage on my C Drive, how can i supply the path? Thank you – Felix Sep 07 '15 at 01:57
-
3Why don't you just `df.to_html('your_filename.html')`? – CT Zhu Sep 07 '15 at 02:01
-
1@CTZhu, that is indeed more elegant! +1. I actually haven't used this method before, so didn't know that. Let me update my answer. – Sait Sep 07 '15 at 02:06
-
Any idea how to also save the styles (CSS)? – Dimitri Feb 03 '19 at 13:45
-
Is there a way to insert an `id` for the `` tag whicle converting DF to `to_html`? – Love Putin Not War Jun 19 '20 at 09:39
14
.to_html() also can be used to create html string
import io
import pandas as pd
from numpy.random import randn
df = pd.DataFrame(
randn(5, 4),
index = 'A B C D E'.split(),
columns = 'W X Y Z'.split()
)
str_io = io.StringIO()
df.to_html(buf=str_io, classes='table table-striped')
html_str = str_io.getvalue()
print(html_str)
<table border="1" class="dataframe table table-striped">
<thead>
<tr style="text-align: right;">
<th></th>
<th>W</th>
<th>X</th>
<th>Y</th>
<th>Z</th>
</tr>
</thead>
<tbody>
<tr>
<th>A</th>
<td>0.302665</td>
<td>1.693723</td>
<td>-1.706086</td>
<td>-1.159119</td>
</tr>
<tr>
<th>B</th>
<td>-0.134841</td>
<td>0.390528</td>
<td>0.166905</td>
<td>0.184502</td>
</tr>
<tr>
<th>C</th>
<td>0.807706</td>
<td>0.072960</td>
<td>0.638787</td>
<td>0.329646</td>
</tr>
<tr>
<th>D</th>
<td>-0.497104</td>
<td>-0.754070</td>
<td>-0.943406</td>
<td>0.484752</td>
</tr>
<tr>
<th>E</th>
<td>-0.116773</td>
<td>1.901755</td>
<td>0.238127</td>
<td>1.996652</td>
</tr>
</tbody>
</table>

Valery Ramusik
- 1,473
- 18
- 19
3
Here is a way to write the pandas table without using to_html, also including an external stylesheet:
html_string_start = '''
<html>
<head><title>Report Title</title></head>
<link rel="stylesheet" type="text/css" href="mystyle.css"/>
<body>
'''
html_string_end = '''
</body>
</html>
'''
with open(r'c:\temp\myfile.html', 'w') as f:
f.write(html_string_start)
f.write('<table>')
for header in dataframe.columns.values:
f.write('<th>'+str(header)+'</th>')
for i in range(len(dataframe)):
f.write('<tr>')
for col in dataframe.columns:
value = dataframe.iloc[i][col]
f.write('<td>'+str(value)+'</td>')
f.write('</tr>')
f.write('</table>')
f.write(html_string_end)

sparrow
- 10,794
- 12
- 54
- 74