39

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

3 Answers 3

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>

Sign up to request clarification or add additional context in comments.

5 Comments

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
Why don't you just df.to_html('your_filename.html')?
@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.
Any idea how to also save the styles (CSS)?
Is there a way to insert an id for the <tbody></tbody> tag whicle converting DF to to_html?
15

.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>

Comments

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.