【问题标题】:Pretty-print an entire Pandas Series / DataFrame漂亮地打印整个 Pandas 系列/DataFrame
【发布时间】:2013-10-08 02:37:53
【问题描述】:

我经常在终端上使用 Series 和 DataFrame。 Series 的默认 __repr__ 返回一个简化的样本,其中包含一些头部和尾部值,但其余部分缺失。

是否有一种内置方法可以漂亮地打印整个系列/数据帧?理想情况下,它将支持正确的对齐方式,可能是列之间的边界,甚至可能支持不同列的颜色编码。

【问题讨论】:

  • 输出减少是由于您可以使用pd.set_option('display.max_rows', 1000) 更改的默认选项,例如,着色是别的东西,我假设您正在谈论为html repr 输出着色。我认为这根本不是内置的。
  • @EdChum:谢谢,我知道这个display.max_rows,问题是大多数时候我确实希望输出被截断。我只是偶尔希望看到完整的输出。我可以将选项设置为一个非常高的值,使用默认的__repr__,然后恢复该值,但这似乎有点麻烦,在这种情况下我还不如编写自己的漂亮打印函数。
  • @EdChum:关于颜色 - 这是一个彩色终端,因此最好将每一行打印成不同的颜色,以便轻松区分值。 Pandas 与 ipython 配合得很好,它使用高级终端功能 - 包括颜色 - 所以我想知道 Pandas 本身是否有一些着色功能。
  • 我在 IPython Notebook 中使用 Pandas 而不是 IPython 作为终端外壳,我在 set_option 中没有看到任何支持着色的选项,它可能可以作为插件来应用一些 CSS 或输出格式。这是我认为你可以实现这一目标的唯一方法

标签: python pandas dataframe


【解决方案1】:

datascroller 的创建部分是为了解决这个问题。

pip install datascroller

它将数据框加载到终端视图中,您可以使用鼠标或箭头键“滚动”,有点像终端上支持查询、突出显示等的 Excel 工作簿。

import pandas as pd
from datascroller import scroll

# Call `scroll` with a Pandas DataFrame as the sole argument:
my_df = pd.read_csv('<path to your csv>')
scroll(my_df)

披露:我是 datascroller 的作者之一

【讨论】:

    【解决方案2】:

    您可以将expand_frame_repr 设置为False

    display.expand_frame_repr : boolean

    是否为宽 DataFrame 打印出完整的 DataFrame repr 跨越多行,max_columns 仍然受到尊重,但输出 如果其宽度超过,将环绕多个“页面” display.width.

    [default: True]


    pd.set_option('expand_frame_repr', False)
    

    更多详情请阅读How to Pretty-Print Pandas DataFrames and Series

    【讨论】:

      【解决方案3】:

      使用pd.options.display

      此答案是先前answer by lucidyan 的变体。它通过避免使用set_option 使代码更具可读性。

      导入 pandas 后,作为使用上下文管理器的替代方法,设置 options 以显示大型数据框:

      def set_pandas_display_options() -> None:
          """Set pandas display options."""
          # Ref: https://stackoverflow.com/a/52432757/
          display = pd.options.display
      
          display.max_columns = 1000
          display.max_rows = 1000
          display.max_colwidth = 199
          display.width = 1000
          # display.precision = 2  # set as needed
      
      set_pandas_display_options()
      

      在此之后,您可以使用display(df) 或仅使用df(如果使用笔记本),否则使用print(df)

      使用to_string

      Pandas 0.25.3 确实有接受格式化选项的 DataFrame.to_stringSeries.to_string 方法。

      使用to_markdown

      如果你需要的是 markdown 输出,Pandas 1.0.0 有 DataFrame.to_markdownSeries.to_markdown 方法。

      使用to_html

      如果您需要的是 HTML 输出,Pandas 0.25.3 确实有 DataFrame.to_html 方法,但没有 Series.to_html。请注意,Series 可以是 convertedDataFrame

      【讨论】:

      • 是的,这似乎是在 Jupyter 而不是 set_option 中显示的一种更优雅的方式。有没有办法左对齐显示的输出?默认情况下,显示的数据框的右行是右对齐的。
      • 附加提示:您可能需要使用print(...)。示例:print(df.to_string())print(df.to_markdown())
      【解决方案4】:

      导入 pandas 后,作为使用上下文管理器的替代方法,设置 options 以显示整个数据帧:

      pd.set_option('display.max_columns', None)  # or 1000
      pd.set_option('display.max_rows', None)  # or 1000
      pd.set_option('display.max_colwidth', None)  # or 199
      

      有关有用选项的完整列表,请参阅:

      pd.describe_option('display')
      

      【讨论】:

      • 感谢您添加此内容。如果要显示多个数据帧,“无”比每个数据帧的实际长度要好得多。
      • @Corrumpo 对于某些选项,如果你想要完整的表示,你应该使用-1 int 值而不是None
      • 似乎没有必要在选项名称中添加 display. 前缀。例如,set_option('max_columns') 也同样有效。
      • minus 1 不再起作用。 None 完成这项工作。
      【解决方案5】:

      脚本

      没有人提出过这种简单的纯文本解决方案:

      from pprint import pprint
      
      pprint(s.to_dict())
      

      产生如下结果:

      {'% Diabetes': 0.06365372374283895,
       '% Obesity': 0.06365372374283895,
       '% Bachelors': 0.0,
       '% Poverty': 0.09548058561425843,
       '% Driving Deaths': 1.1775938892425206,
       '% Excessive Drinking': 0.06365372374283895}
      

      Jupyter 笔记本

      此外,在使用 Jupyter 笔记本时,这是一个很好的解决方案。

      注意:pd.Series() 没有.to_html() 所以必须转换成pd.DataFrame()

      from IPython.display import display, HTML
      
      display(HTML(s.to_frame().to_html()))
      

      产生如下结果:

      【讨论】:

        【解决方案6】:

        尝试使用 display() 函数。这将自动使用水平和垂直滚动条,这样您就可以轻松地显示不同的数据集,而不是使用 print()。

        display(dataframe)
        

        display() 也支持正确对齐。

        但是,如果您想让数据集更漂亮,可以查看pd.option_context()。它有很多选项可以清楚地显示数据框。

        注意 - 我正在使用 Jupyter Notebooks。

        【讨论】:

          【解决方案7】:

          您也可以使用option_context,带有一个或多个选项:

          with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
              print(df)
          

          这将自动将选项恢复为之前的值。

          如果您正在使用 jupyter-notebook,使用 display(df) 而不是 print(df) 将使用 jupyter 丰富的显示逻辑 (like so)

          【讨论】:

          • 谢谢!请注意,将最大值设置为 None 会关闭它们。使用with pd.option_context() 选项可以非常清楚和明确地记录正在发生的事情,并清楚地说明如何实现可能需要的输出格式的其他更改,例如使用precisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencoding 等等:pandas.pydata.org/pandas-docs/stable/options.html
          • 对于任何想知道的人:使用 jupyter 时,请使用 display(df) 而不是 print(df)
          • 如果 DataFrame 真的很大,暂时将其写为 .csv 并使用 Jupyter Lab 的快速 csv 查看器可能是有意义的
          • 为避免将列相互包裹,您还可以将..., 'display.width', 100, ...(具有适当的值)添加到上下文管理器。
          • 谁能解释一下为什么 Pandas 的语法总是如此随意?为什么不能是 pd.option_context(display_max_rows=None)?还是 pd.option_context({'display.max_rows': None}) 或者其他一些合理的语法?
          【解决方案8】:

          使用表格包:

          pip install tabulate
          

          并考虑以下示例用法:

          import pandas as pd
          from io import StringIO
          from tabulate import tabulate
          
          c = """Chromosome Start End
          chr1 3 6
          chr1 5 7
          chr1 8 9"""
          
          df = pd.read_table(StringIO(c), sep="\s+", header=0)
          
          print(tabulate(df, headers='keys', tablefmt='psql'))
          
          +----+--------------+---------+-------+
          |    | Chromosome   |   Start |   End |
          |----+--------------+---------+-------|
          |  0 | chr1         |       3 |     6 |
          |  1 | chr1         |       5 |     7 |
          |  2 | chr1         |       8 |     9 |
          +----+--------------+---------+-------+
          

          【讨论】:

          • 制表在打印 pd.Series 时出现问题。
          • @eliu 感谢您的信息。你总是有pd_series.to_frame()
          【解决方案9】:

          您可以使用以下方法实现此目的。只要通过总数。 DataFrame 中作为 arg 存在的列数

          'display.max_columns'

          例如:

          df= DataFrame(..)
          with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
              print(df)
          

          【讨论】:

            【解决方案10】:

            如果您使用的是 Ipython Notebook (Jupyter)。您可以使用 HTML

            from IPython.core.display import HTML
            display(HTML(df.to_html()))
            

            【讨论】:

            • 请显示输出以便与其他解决方案进行比较,Tnx。
            • 当心试图用这个来展示一个大的数据框。除非您编辑 .ipyndb 文件中的原始代码,否则您可能会耗尽内存并且永远无法再次打开您的笔记本。真实的故事;)
            • 这对我来说是最好的选择。表格以彩色完整显示。不错!
            【解决方案11】:

            试试这个

            pd.set_option('display.height',1000)
            pd.set_option('display.max_rows',500)
            pd.set_option('display.max_columns',500)
            pd.set_option('display.width',1000)
            

            【讨论】:

              【解决方案12】:

              当然,如果这种情况经常出现,请制作一个类似这样的函数。您甚至可以将其配置为每次启动 IPython 时加载:https://ipython.org/ipython-doc/1/config/overview.html

              def print_full(x):
                  pd.set_option('display.max_rows', len(x))
                  print(x)
                  pd.reset_option('display.max_rows')
              

              至于着色,对颜色过于复杂听起来会适得其反,但我同意像bootstrap's .table-striped 这样的东西会很好。您可以随时 create an issue 推荐此功能。

              【讨论】:

              • 链接已失效。也许应该是ipython.org/ipython-doc/dev/config/intro.html
              • 如果有人、任何人,甚至可能是作者,能够验证并修复链接并将这些 cmets 标记为过时,那就太好了。
              • 这很糟糕,因为它假定该选项在打印操作之前被设置为默认值,这不一定是这种情况,因此可能会导致意外行为。将选项上下文与 with 语句结合使用是更强大的选项,并且将恢复为之前设置的任何内容。
              • 这样做会在没有任何表格格式的情况下打印,是否可以像通常通过在单元格末尾调用'df'来格式化输出?
              【解决方案13】:

              无需破解设置。有一个简单的方法:

              print(df.to_string())
              

              【讨论】:

              • 你有多少列?我检查了 1300 列,它工作正常: from itertools import combination from string import ascii_letters df = pd.DataFrame(data=[[0]*1326], index=[0], columns=[(a+b)对于组合中的 a,b (ascii_letters, 2)])
              • 使用with pd.option_context() 选项可以更清楚、更明确地记录正在发生的事情,并清楚说明如何实现可能需要的输出格式的其他更改,例如使用precisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencoding 等等:pandas.pydata.org/pandas-docs/stable/options.html
              • 我确实更喜欢其他答案,因为如果我有很多列并且我的屏幕不够宽而无法显示它们,这在我的示例中看起来很奇怪。列名和数据会做单独的换行,所以不容易看出哪些数据属于哪个列名。
              • 提问者要求提供“漂亮打印”的解决方案。这是不是它。如果在 Jupyter Notebook 中使用它,则根本不会使用内置的漂亮显示。最好在打印df 之前使用pd.set_option('display.max_rows', None)
              • 这可能不是问题的解决方案,但 正是我想要查看的 df 并继续前进。
              猜你喜欢
              • 2017-05-26
              • 2015-02-07
              • 2016-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多