漂亮地打印整个Pandas系列/ DataFrame


650

我在终端上经常使用Series和DataFrames。__repr__系列的默认值返回精简的样本,具有一些头和尾值,但其余部分丢失。

有没有一种内置方法可以漂亮地打印整个Series / DataFrame?理想情况下,它将支持适当的对齐方式,可能支持列之间的边界,甚至可能对不同列进行颜色编码。


19
输出减少是由于您可以使用默认选项进行更改pd.set_option('display.max_rows', 1000),例如,可以使用其他颜色更改颜色,我假设您正在谈论为html repr输出着色。我认为这根本不是内置的。
EdChum

2
@EdChum:谢谢,我对此很了解display.max_rows,问题在于我大多数时候确实希望输出被截断。我只是偶尔希望看到完整的输出。我可以将选项设置为一个很高的值,使用default __repr__,然后还原该值,但这似乎有点麻烦,在这种情况下,我不妨编写自己的漂亮打印函数。
2013年

1
@EdChum:关于颜色-这是一个颜色终端,因此最好将每行打印为不同的颜色,以轻松区分彼此的值。Pandas与使用高级终端功能(包括颜色)的ipython配合得很好,所以我想知道Pandas本身是否具有某些着色功能。
2013年

1
我在IPython Notebook中使用Pandas而不是IPython作为终端外壳,我看不到任何set_option支持颜色的选项,这可能可以作为应用某些CSS或输出格式的插件来完成。这是我认为您可以实现这一目标的唯一方法
EdChum 2013年

Answers:


862

您也可以将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 rich的显示逻辑(像这样)


2
谢谢!请注意,设置最大值以None将其关闭。使用with pd.option_context()什么是要去很清楚和明确的选项文件,并明确如何实现在输出格式可能需要的,例如使用其他的变化precisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencoding,和许多许多:pandas.pydata.org/pandas -docs / stable / options.html
nealmcb

37
对于任何想知道的人:使用jupyter时,请使用display(df)代替print(df)
tsvikas

3
3在这里代表什么?
蒙娜·贾拉勒

1
如果DataFrame确实很大,则可以临时将其编写为.csv并使用Jupyter Lab的快速csv查看器
Dan

display.max_columns的“ 3”应为“ None”,以将option_context参数设置为其默认值。固定。
Trutane

605

无需修改设置。有一个简单的方法:

print(df.to_string())

1
您有几列?我已经检查了1300列,并且工作正常:从itertools导入从字符串导入的组合ascii_letters df = pd.DataFrame(data = [[0] * 1326],index = [0],columns = [(a + b)对于组合中的a,b(ascii_letters,2)])
Andrey Shokhin

11
使用with pd.option_context()什么要去更加清晰和明确的选项文件,并明确如何实现在输出格式可能需要的,例如使用其他的变化precisionmax_colwidthexpand_frame_reprcolheader_justifydate_yearfirstencoding,和许多许多:pandas.pydata.org/ pandas-docs / stable / options.html
nealmcb

2
我确实喜欢其他答案,因为如果我有很多列并且我的屏幕不够宽,无法显示它们,那么在我的示例中这看起来很奇怪。列名和数据将进行单独的换行符,因此再也不容易查看哪些数据属于哪个列名。
Dremet '17

9
询问者要求提供“精美印刷”解决方案。这是不是它。如果在Jupyter Notebook中使用此功能,则根本不会使用内置的漂亮显示器。最好pd.set_option('display.max_rows', None)在打印之前使用df
LS

@LS在python 3.x Jupyter笔记本上测试了pd.set_option('display.max_rows',None)和df.to_string(),并且在打印时产生了相同的输出。如果上述答案不适用于以前的版本,则现在可以使用。
H Froedge

166

当然,如果出现很多情况,请创建一个像这样的功能。您甚至可以将其配置为在每次启动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')

至于颜色,过于精致的颜色听起来适得其反,但我同意类似引导程序的方法.table-striped会很好。您总是可以创建一个问题来建议该功能。



2
如果有人,任何人,甚至是作者都可以验证并修复链接并将这些评论标记为过时,那将是很好的。
亚伦·霍尔

这是不好的,因为它假定在打印操作之前将选项设置为默认值,但情况并非一定如此,因此可能导致意外行为。将选项上下文与with语句一起使用是更健壮的选项,并且将还原为之前设置的任何内容。
inVader

104

导入熊猫后,作为使用上下文管理器的替代方法,请设置以下选项以显示整个数据框:

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

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

pd.describe_option('display')

1
感谢您添加。如果要显示多个数据帧,“无”比每个单个数据帧的实际长度要好得多。
Dremet '17

5
@Corrumpo对于某些选项,如果要完整表示,则应使用-1int值代替None
lucidyan

display.选项名称中的前缀似乎没有必要。例如,set_option('max_columns')同样有效。
Acumenus

非常感谢:)
Orsiris de Jong

45

使用列表包:

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

2
@eliu感谢您的信息。您始终拥有pd_series.to_frame()
Unfun Cat,

20

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

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

1
请显示输出以与其他解决方案Tnx进行比较。
vwvan

7
当心尝试显示与此相关的大数据框。除非您在.ipyndb文件中编辑原始代码,否则可能会耗尽内存,并且永远无法再次打开笔记本。真实的故事;)
FLBKernel

这对我来说是最好的选择。该表以彩色显示完整。好一个!
Ololade

20

使用 pd.options.display

此答案是lucidyan先前的答案的变形。通过避免使用,可以使代码更具可读性set_option

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

def set_pandas_display_options() -> None:
    # Ref: https://stackoverflow.com/a/52432757/
    display = pd.options.display

    display.max_columns = 1000
    display.max_rows = 1000
    display.max_colwidth = 199
    display.width = None
    # display.precision = 2  # set as needed

set_pandas_display_options()

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

使用 to_string

熊猫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可以将a 转换DataFrame


是的,这似乎是在Jupyter中显示而不是set_option更好的优雅方式。有没有办法使显示的输出左对齐?默认情况下,显示的数据框的右行右对齐。
Vinsinraw

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)

3

您可以使用以下方法来实现。只要通过总编号。DataFrame中以arg形式存在的列数

'display.max_columns'

例如:

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

-1

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

display(dataframe)

display()也支持正确的对齐方式。

但是,如果要使数据集更漂亮,可以进行检查pd.option_context()。它有很多选项可以清楚地显示数据框。

注意-我正在使用Jupyter笔记本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.