我在使用Pandas“to_html”方法应用“classes”参数来设置DataFrame样式时遇到了麻烦。
“classes:str或list或tuple,默认为None 要应用于生成的html表的CSS类“ 来自:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_html.html
我可以像这样呈现样式化的DataFrame(例如):
next: 1
in else - acc: 0
next: 2
in if - acc: NaN
next: 3
in else - acc: NaN
next: 4
in if - acc: NaN
sum: undefined
如何使用带有“to_html”的“classes”来设置DataFrame的html输出,如下所示:
df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
myhtml = df.style.set_properties(**{'font-size': '11pt', 'font-family': 'Calibri','border-collapse': 'collapse','border': '1px solid black'}).render()
with open('myhtml.html','w') as f:
f.write(myhtml)
答案 0 :(得分:27)
Pandas的to_html
仅输出包含HTML表标记的大字符串。 classes参数是为<table>
提供一个 class 属性的便利处理程序,该属性将在对其进行样式设置的先前创建的 CSS文档中被引用。因此,请将to_html
合并到引用外部CSS的更广泛的HTML文档版本中。
有趣的是,to_html
添加了双重类<table class="dataframe mystyle">
,可以在CSS中单独.dataframe {...} .mystyle{...}
或一起.dataframe.mystyle {...}
来引用双重类。下面用随机数据演示。
数据
import pandas as pd
import numpy as np
pd.set_option('display.width', 1000)
pd.set_option('colheader_justify', 'center')
np.random.seed(6182018)
demo_df = pd.DataFrame({'date': np.random.choice(pd.date_range('2018-01-01', '2018-06-18', freq='D'), 50),
'analysis_tool': np.random.choice(['pandas', 'r', 'julia', 'sas', 'stata', 'spss'],50),
'database': np.random.choice(['postgres', 'mysql', 'sqlite', 'oracle', 'sql server', 'db2'],50),
'os': np.random.choice(['windows 10', 'ubuntu', 'mac os', 'android', 'ios', 'windows 7', 'debian'],50),
'num1': np.random.randn(50)*100,
'num2': np.random.uniform(0,1,50),
'num3': np.random.randint(100, size=50),
'bool': np.random.choice([True, False], 50)
},
columns=['date', 'analysis_tool', 'num1', 'database', 'num2', 'os', 'num3', 'bool']
)
print(demo_df.head(10))
# date analysis_tool num1 database num2 os num3 bool
# 0 2018-04-21 pandas 153.474246 mysql 0.658533 ios 74 True
# 1 2018-04-13 sas 199.461669 sqlite 0.656985 windows 7 11 False
# 2 2018-06-09 stata 12.918608 oracle 0.495707 android 25 False
# 3 2018-04-24 spss 88.562111 sql server 0.113580 windows 7 42 False
# 4 2018-05-05 spss 110.231277 oracle 0.660977 windows 10 76 True
# 5 2018-04-05 sas -68.140295 sql server 0.346894 windows 10 0 True
# 6 2018-05-07 julia 12.874660 postgres 0.195217 ios 79 True
# 7 2018-01-22 r 189.410928 mysql 0.234815 windows 10 56 False
# 8 2018-01-12 pandas -111.412564 sql server 0.580253 debian 30 False
# 9 2018-04-12 r 38.963967 postgres 0.266604 windows 7 46 False
CSS (另存为df_style.css)
/* includes alternating gray and white with on-hover color */
.mystyle {
font-size: 11pt;
font-family: Arial;
border-collapse: collapse;
border: 1px solid silver;
}
.mystyle td, th {
padding: 5px;
}
.mystyle tr:nth-child(even) {
background: #E0E0E0;
}
.mystyle tr:hover {
background: silver;
cursor: pointer;
}
熊猫
pd.set_option('colheader_justify', 'center') # FOR TABLE <th>
html_string = '''
<html>
<head><title>HTML Pandas Dataframe with CSS</title></head>
<link rel="stylesheet" type="text/css" href="df_style.css"/>
<body>
{table}
</body>
</html>.
'''
# OUTPUT AN HTML FILE
with open('myhtml.html', 'w') as f:
f.write(html_string.format(table=demo_df.to_html(classes='mystyle')))
输出
HTML (引用df_style.css,假定在同一目录中;请参见表中的类参数)
<html>
<head><title>HTML Pandas Dataframe with CSS</title></head>
<link rel="stylesheet" type="text/css" href="df_style.css"/>
<body>
<table border="1" class="dataframe mystyle">
<thead>
<tr style="text-align: center;">
<th></th>
<th>date</th>
<th>analysis_tool</th>
<th>num1</th>
<th>database</th>
<th>num2</th>
<th>os</th>
<th>num3</th>
<th>bool</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>2018-04-21</td>
<td>pandas</td>
<td>153.474246</td>
<td>mysql</td>
<td>0.658533</td>
<td>ios</td>
<td>74</td>
<td>True</td>
</tr>
<tr>
<th>1</th>
<td>2018-04-13</td>
<td>sas</td>
<td>199.461669</td>
<td>sqlite</td>
<td>0.656985</td>
<td>windows 7</td>
<td>11</td>
<td>False</td>
</tr>
<tr>
<th>2</th>
<td>2018-06-09</td>
<td>stata</td>
<td>12.918608</td>
<td>oracle</td>
<td>0.495707</td>
<td>android</td>
<td>25</td>
<td>False</td>
</tr>
<tr>
<th>3</th>
<td>2018-04-24</td>
<td>spss</td>
<td>88.562111</td>
<td>sql server</td>
<td>0.113580</td>
<td>windows 7</td>
<td>42</td>
<td>False</td>
</tr>
<tr>
<th>4</th>
<td>2018-05-05</td>
<td>spss</td>
<td>110.231277</td>
<td>oracle</td>
<td>0.660977</td>
<td>windows 10</td>
<td>76</td>
<td>True</td>
</tr>
...
</tbody>
</table>
</body>
</html>
答案 1 :(得分:4)
本质上,pandas.to_html()仅导出纯HTML表。您可以将表插入到正文中的任意位置,并通过样式部分中的CSS控制样式。
<html>
<head>
<style>
table, th, td {{font-size:10pt; border:1px solid black; border-collapse:collapse; text-align:left;}}
th, td {{padding: 5px;}}
</style>
</head>
<body>
{
pandas.to_html()
}
</body>
</html>
答案 2 :(得分:3)
我发现最精确也是最简单的方法是跳过样式,to_html()等,并使用df.to_dict()方法将DF转换为字典。
特别给我带来麻烦的是,在Outlook电子邮件中显示样式化的html熊猫html,因为它无法正确显示熊猫所产生的css混乱。
遍历字典并在其中生成html,方法是将键/值简单包装在所需的标记中,添加类等,然后将所有这些都连接成一个字符串。 然后将此str粘贴到具有预定义CSS的准备好的模板中。
为方便起见,我发现两次导出相同的df很有用,使用.to_dict()和to_dict('index')首先填充列,然后逐行向下移动。或者,只需列出相关列的名称即可。
dict_data = [df.to_dict(), df.to_dict('index')]
return_str = '<table><tr>'
for key in dict_data[0].keys():
return_str = return_str + '<th class="header">' + key + '</th>'
return_str = return_str + '</tr>'
for key in dict_data[1].keys():
return_str = return_str + '<tr><th class="index">' + key + '</th>'
for subkey in dict_data[1][key]:
return_str = return_str + '<td>' + dict_data[1][key][subkey] + '</td>'
return_str = return_str + '</tr></table>'
,然后return_str进入模板。
答案 3 :(得分:0)
这是我的做法
为CSS代码创建文本文件,并在此处写下您的CSS代码,例如css_style.txt 现在,在您的python文件中以字符串形式读取该txt文件
with open('css_style.txt', 'r') as myfile:
style = myfile.read()
现在使用HTML代码
"""<html><head>Something Something</head>{1}<div>{0}</div></html>""".format(some_panda_dataframe.to_html,style)
在我的情况下,css_style.txt文件为
<style>
table {
border-collapse: collapse;
width: 100%;
}
th {
text-align: center;
padding: 8px;
}
td {
text-align: left;
padding: 8px;
}
tr:nth-child(even){background-color: #FFD5D5}
th {
background-color: #0000FF;
color: white;
}
</style>