【问题标题】:Pagination on pandas dataframe.to_html()pandas dataframe.to_html() 上的分页
【发布时间】:2016-08-11 10:13:04
【问题描述】:

我有一个巨大的 pandas 数据框,我正在转换为 html 表,即dataframe.to_html(),它大约有 1000 行。任何使用分页的简单方法,这样我就不必滚动整个 1000 行。比如说,查看前 50 行然后点击下一步查看后续 50 行?

【问题讨论】:

  • 这确实是一个有趣的问题!如果可以使用 CSS 类实现“分页”,您可以尝试有条件地使用Style(即第 0-49 行 - 样式:page1、50-99 - 样式:page2 等)。
  • 您是想在 Jupyter 笔记本中查看它,还是将其作为独立的 HTML 文件查看?

标签: python pandas


【解决方案1】:

我能想到的最佳解决方案涉及几个外部 JS 库:JQuery 及其DataTables plugin。这将允许的不仅仅是分页,而且只需很少的努力。

让我们设置一些 HTML、JS 和 python:

from tempfile import NamedTemporaryFile
import webbrowser

base_html = """
<!doctype html>
<html><head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.css">
<script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.js"></script>
</head><body>%s<script type="text/javascript">$(document).ready(function(){$('table').DataTable({
    "pageLength": 50
});});</script>
</body></html>
"""

def df_html(df):
    """HTML table with pagination and other goodies"""
    df_html = df.to_html()
    return base_html % df_html

def df_window(df):
    """Open dataframe in browser window using a temporary file"""
    with NamedTemporaryFile(delete=False, suffix='.html') as f:
        f.write(df_html(df))
    webbrowser.open(f.name)

现在我们可以加载一个示例数据集来测试它:

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

df_window(df)

美丽的结果:

几点说明:

  • 注意base_html 字符串中的pageLength 参数。这是我定义每页默认行数的地方。您可以在 DataTable options page 中找到其他可选参数。
  • df_window 函数在 Jupyter Notebook 中进行了测试,但在普通 python 中也应该可以工作。
  • 您可以跳过df_window,只需将df_html 的返回值写入HTML 文件。

编辑:如何通过远程会话(例如 Colab)进行这项工作

在远程笔记本上工作时,例如在 Colab 或 Kaggle 中,临时文件方法将不起作用,因为文件保存在远程计算机上,您的浏览器无法访问。一种解决方法是下载构建的 HTML 并在本地打开它(添加到前面的代码):

import base64
from IPython.core.display import display, HTML

my_html = df_html(df)
my_html_base64 = base64.b64encode(my_html.encode()).decode('utf-8')
display(HTML(f'<a download href="data:text/html;base64,{my_html_base64}" target="_blank">Download HTML</a>'))

这将产生一个包含整个 HTML 编码为 base64 字符串的链接。点击它会下载HTML文件,然后您可以直接打开它并查看表格。

【讨论】:

  • 我在使用笔记本时遇到错误。 TypeError: a bytes-like object is required, not 'str'。你有什么想法吗?
  • @RonakShah,我假设您使用的是 python3。尝试将mode='w+' 添加到NamedTemporaryFile 参数中并告诉我它是否有效。
  • 似乎我需要解决一些问题。您提供的代码工作正常。谢谢你的帮助:)
  • 我有一个问题。当我尝试在 google collab 中运行时,我做不到。有什么建议可以合作吗?提前致谢。
  • @GSandro_Strongs 我已经编辑了答案并为您提供了解决方案。让我知道它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 2016-04-09
  • 2017-05-17
  • 2019-01-27
  • 2017-03-04
  • 1970-01-01
  • 2017-04-05
  • 2021-03-02
相关资源
最近更新 更多