在IPython Notebook中,如何以水平滚动的形式将DataFrame以表格展示?使用Pyspark。

42

使用 DataFrame.show() 方法显示的 pyspark.sql.DataFrame 显示不整齐 - 行被换行而不是滚动。

图像描述

但使用 pandas.DataFrame.head 方法显示则正常。

图像描述

我尝试了这些选项

import IPython
IPython.auto_scroll_threshold = 9999

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
from IPython.display import display

但是没有运气。尽管使用带有jupyter插件的Atom编辑器时滚动条可以工作:

在此输入图片描述


1
你在这里有任何进展吗? - Andi Anderle
我认为我做的是:从Spark DataFrame中限制几行,然后在这个“head”DataFrame上使用spark_df_head.toPandas() - muon
11个回答

34

这是一个解决方法

spark_df.limit(5).toPandas().head()

虽然我不知道这个查询的计算负担有多重,但我认为 limit() 不会很昂贵。欢迎指正。


同意这不是一个好的解决方案 - 但我还没有看到一个“本地”的(非pandas)替代方案。 - WestCoastProjects
3
请注意, limit() 不保留数据框的顺序。 - Louis Yang
如果DataFrame已经排序,那么是的,它可以。 - rjurney
这个解决方案只适用于小表。除此之外,它会减慢整个过程。 - ilan_pinto
1
基于这一次测试,性能似乎不是问题: 使用%%timeit 魔术命令进行定时: spark_df.limit(5).toPandas().head() - 9.6秒 spark_df.show(5) - 10.1秒 在连接到远程databricks的PySpark with DBconnect的JupyterLab 1.0.1上运行。spark_df是一个中等大小的数据框。 - Ran Feldesh
显示剩余2条评论

31

只需添加(并执行)

from IPython.core.display import HTML
display(HTML("<style>pre { white-space: pre !important; }</style>"))

你会得到带有滚动条的df.show()enter image description here


1
超级好的,谢谢! - rewreu
这个很好用。不幸的是,它也有一个缺点,即在Markdown单元格中添加水平滚动条。 - Jakob
我想知道为什么这不是Spark/Jupyter的默认设置。有可能存在任何缺点吗? - Reza Keshavarz

16

如果有人仍然遇到这个问题,可以通过使用开发者工具调整网站设置来解决。

当你执行enter image description here

打开开发者设置(F12)。然后检查元素(Windows:ctrl+shift+c,Mac:cmd+option+c)。之后点击(选择)数据框输出(如上图所示)。并取消勾选空格属性(见下面的快照) enter image description here

您只需要进行一次此设置。(除非您刷新页面)

这将原生地显示您的确切数据。无需转换为pandas。


这对于快速而简单的演示非常完美,谢谢!是的,如果重新加载会出现问题,但对于屏幕录制来说非常完美。 - K.S.

10

只需编辑css文件,你就可以继续了。

  1. 打开jupyter笔记本的 ../site-packages/notebook/static/style/style.min.css 文件。

  2. 搜索 white-space: pre-wrap;,并将其删除。

  3. 保存文件并重新启动jupyter-notebook。

问题解决了。 :)


1
尝试使用 display(dataframe_name),它可以呈现一个可滚动的表格。

4
这在我的 Jupyter Notebook 中无法运行。它可以在 Databricks 笔记本中运行,但问题是针对 Jupyter 笔记本的。 - muon
你的回答为我解决了一个非常重要的问题。我一直在尝试在Databricks中执行一些操作后下载数据样本,但是互联网上的所有答案似乎都对我无效。你的回答创建了一个表,其中包含我可以下载的100条记录的样本。非常感谢你。 - AshwiniJ

1

除了 @karan-singla 和 @vijay-jangir 给出的答案之外,一个方便的一行代码来注释掉 white-space: pre-wrap 样式可以这样实现:

$ awk -i inplace '/pre-wrap/ {$0="/*"$0"*/"}1' $(dirname `python -c "import notebook as nb;print(nb.__file__)"`)/static/style/style.min.css

这段话的翻译是:将包含pre-wrap的行用awk更新,使其被*/ -- */包围,即注释掉,作用于在你的Python工作环境中找到的styles.css文件。理论上来说,如果你使用多个环境,比如Anaconda,那么可以将其用作别名。
参考链接:

0
我会创建一个小函数,将PySpark数据框转换为Pandas数据框,然后选择头部并像这样调用它。
函数
def display_df(df):
    return df.limit(5).toPandas().head()

然后调用

display_df(spark_df)

你需要先导入pandas库

import pandas as pd

0

这个解决方案不依赖于pandas,它不会改变jupyter的设置,而且看起来很好(滚动条将自动激活)。

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("My App").getOrCreate()
spark.conf.set("spark.sql.repl.eagerEval.enabled", True)

data = [
  [1, 1, 'A'],
  [2, 2, 'A'],
  [3, 3, 'A'],
  [4, 3, 'B'],
  [5, 4, 'B'],
  [6, 5, 'C'],
  [7, 6, 'C']]
df = spark.sparkContext.parallelize(data).toDF(('column_1', 'column_2', 'column_3'))

# This will print a pretty table
df

0

对于我来说,由于我正在使用一个无法访问CSS文件的环境,并且想要使用Jupyter魔术命令在单元格中完成它,我找到了一个不错的解决方案。

https://dev59.com/Q1QJ5IYBdhLWcg3wnHPm#63476260上找到了解决方案。

只需将以下内容粘贴到单元格中:

%%html
<style>
div.output_area pre {
    white-space: pre;
}

在 Scala 笔记本中也可以使用


0
要精确地说,针对之前某人所说的内容。 在文件anaconda3/lib/python3.7/site-packages/notebook/static/style/style.min.css中, 有2个white-space: nowrap;,你必须以这种方式注释掉其中一个:samp { /*white-space: nowrap;*/ }, 保存并重新启动jupyter。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接