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

Reza Rahemtola
  • 1,182
  • 7
  • 16
  • 30
Felix
  • 1,539
  • 8
  • 20
  • 35

3 Answers3

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>
johan
  • 1,664
  • 2
  • 14
  • 30
Sait
  • 19,045
  • 18
  • 72
  • 99
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