【问题标题】:Show DataFrame as table in iPython Notebook在 iPython Notebook 中将 DataFrame 显示为表格
【发布时间】:2015-01-08 11:42:36
【问题描述】:

我正在使用 iPython 笔记本。当我这样做时:

df

我得到了一张漂亮的带有单元格的表格。但是,如果我这样做:

df1
df2 

它不会打印第一张漂亮的桌子。如果我试试这个:

print df1
print df2

它以不同的格式打印出表格,使列溢出并使输出非常高。

有没有办法强制它为两个数据集打印出漂亮的表格?

【问题讨论】:

  • display(df)(与from IPython.display import display),或print df.to_html()
  • @joris,您的评论似乎回答了这个问题,所以您能否将其发布为答案,这样问题就不会悬而未决?

标签: pandas printing ipython-notebook jupyter-notebook display


【解决方案1】:

您可以使用 markdown 创建表格。如果 tabulate 软件包尚不可用,系统会要求您先安装它。

from IPython.display import display, Markdown

display(Markdown(df.to_markdown()))

【讨论】:

  • 这种方法几乎不适合我。 HTML(df.to_html()) 正确转义字符,markdown 没有。
【解决方案2】:

显示列表中包含的数据框:

dfs = [df1, df2]
display(*dfs)

【讨论】:

  • 这仅显示列/标题名称,这不是 OP 要求的。相反,他们希望以良好的格式打印整个 DataFrame。因此,对于更广泛的数据框,display(df)display(HTML(df2.to_html())) 是正确且公认的答案。
  • @Kim 请重读我的回答。如果还是不信,就用代码验证一下。我坚持我的答案。
  • 对造成的混乱表示歉意。我确实忽略了您答案的“包含在列表中”部分。所以你是对的,你的例子适用于 dfs 作为数据框列表。我建议相应地更新您的代码示例,以使其在代码中也脱颖而出。特别是因为这是您为讨论带来的额外价值。我很乐意改变我的投票。
  • 不完整阅读答案是很常见的。我自己做过。也许多达 40% 的 cmets 是误解。
【解决方案3】:

为了在 Jupyter Notebook 中显示 DataFrame,只需输入:

显示(名称_of_the_DataFrame)

例如:

显示(df)

【讨论】:

    【解决方案4】:

    我不喜欢乱用 HTML,而是尽可能多地使用原生基础设施。您可以将输出小部件与 Hbox 或 VBox 一起使用:

    import ipywidgets as widgets
    from IPython import display
    import pandas as pd
    import numpy as np
    
    # sample data
    df1 = pd.DataFrame(np.random.randn(8, 3))
    df2 = pd.DataFrame(np.random.randn(8, 3))
    
    # create output widgets
    widget1 = widgets.Output()
    widget2 = widgets.Output()
    
    # render in output widgets
    with widget1:
        display.display(df1)
    with widget2:
        display.display(df2)
    
    # create HBox
    hbox = widgets.HBox([widget1, widget2])
    
    # render hbox
    hbox
    

    这个输出:

    【讨论】:

      【解决方案5】:
      from IPython.display import display
      display(df)  # OR
      print df.to_html()
      

      【讨论】:

      • 正如@emunsing 所说,.to_html() 不起作用,它会提供未渲染的 html 表。
      【解决方案6】:

      您需要使用 IPython 显示模块中的 HTML()display() 函数:

      from IPython.display import display, HTML
      
      # Assuming that dataframes df1 and df2 are already defined:
      print "Dataframe 1:"
      display(df1)
      print "Dataframe 2:"
      display(HTML(df2.to_html()))
      

      请注意,如果您只是 print df1.to_html(),您将获得原始的、未渲染的 HTML。

      也可以从IPython.core.display导入,效果一样

      【讨论】:

      • 是否可以让python自动打开浏览器并显示HTML(df2.to_html())
      • @Cina 您应该能够将 HTML 写入文件,然后在该文件上调用您最喜欢的浏览器,但如何做到这一点在很大程度上取决于您所在的系统,即浏览器等。
      • HTML(df2.to_html()) 什么都不做。您应该执行 display(HTML(df2.to_html())) 来呈现数据框。我试图编辑你的答案,但不知何故被拒绝了。
      • 在 5.6.0 版上你不需要import display
      • 如何处理串连的字符串?例如从文本列中获取所有文本。
      【解决方案7】:

      您似乎可以在显示之间使用逗号来显示两个 dfs。 我在 github 上的一些笔记本上注意到了这一点。此代码来自 Jake VanderPlas 的笔记本。

      class display(object):
          """Display HTML representation of multiple objects"""
          template = """<div style="float: left; padding: 10px;">
          <p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
          </div>"""
          def __init__(self, *args):
              self.args = args
      
          def _repr_html_(self):
              return '\n'.join(self.template.format(a, eval(a)._repr_html_())
                           for a in self.args)
      
          def __repr__(self):
              return '\n\n'.join(a + '\n' + repr(eval(a))
                             for a in self.args)
      

      display('df', "df2")

      【讨论】:

        【解决方案8】:

        此答案基于此博客文章中的第二个提示:28 Jupyter Notebook tips, tricks and shortcuts

        您可以将以下代码添加到笔记本顶部

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

        这告诉 Jupyter 在它自己的行上打印任何变量或语句的结果。因此,您可以执行一个仅包含

        的单元格
        df1
        df2
        

        它会“打印出两个数据集的漂亮表格”。

        【讨论】:

        • 这个解决方案效果很好,解决了最初的问题。谢谢!
        • 如果您不想显示所有内容,是否有办法抑制输出?理想情况下,将分号放在末尾会阻止打印。
        • @IonSme 如果你在最后一行的末尾加上一个分号,那么我认为它会抑制所有输出,否则我认为它不会抑制任何输出。如果要抑制变量的输出,则不要将变量放在自己的行上。您希望在哪些情况下抑制某些变量的输出,但仍将它们放在自己的行上?
        猜你喜欢
        • 2015-03-04
        • 2014-04-04
        • 2016-07-20
        • 2016-01-10
        • 2019-01-28
        相关资源
        最近更新 更多