Pretty-print an entire Pandas Series / DataFrame
我经常在终端上使用系列和数据帧。序列的默认__repr__返回一个减少的样本,其中有一些头和尾值,但其他值丢失。
是否有一种内置的方式来漂亮地打印整个系列/数据帧?理想情况下,它将支持适当的对齐,可能是列之间的边框,甚至可能是不同列的颜色编码。
- 减少的输出是由于默认选项,您可以使用pd.set_option('display.max_rows', 1000)更改这些选项。例如,着色是另一种情况,我假设您正在讨论如何着色HTML repr输出。我觉得这根本不是内置的。
- @edchum:谢谢,我知道这个display.max_rows,问题是大部分时间我都希望输出被截断。我只是偶尔希望看到完整的输出。我可以将选项设置为一个非常高的值,使用默认的__repr__,然后还原该值,但这似乎有点麻烦,在这种情况下,我还可以编写自己的漂亮打印函数。
- @Edchum:关于颜色-这是一个颜色终端,所以最好让每一行以不同的颜色打印,以便轻松区分值。熊猫与ipython配合得很好,ipython使用了高级终端功能(包括颜色),所以我想知道熊猫本身是否具有一些着色功能。
- 我在ipython笔记本中使用pandas而不是ipython作为终端外壳,我在set_option中没有看到任何支持着色的选项,它可能是作为插件来应用CSS或输出格式的。我认为只有这样你才能做到
您还可以使用option_context,其中有一个或多个选项:
1 2
| with pd.option_context('display.max_rows', None, 'display.max_columns', None): # more options can be specified also
print(df) |
这将自动将选项返回到以前的值。
如果您正在使用Jupyter笔记本,使用display而不是print将使用Jupyter丰富的显示逻辑。
- 这也许是正确的答案,但对我来说没有任何改变:
- @阿莫斯博多维茨,这对你来说有什么用?
- 谢谢您!注意,将max值设置为None将关闭它们。使用with pd.option_context()选项可以非常清楚和明确地记录正在发生的事情,并且可以清楚地说明如何在输出格式中实现可能需要的其他更改,例如,使用precision、max_colwidth、expand_frame_repr、colheader_justify、date_yearfirst、encoding,以及更多:pandas.pydata.org/pandas-docs/stable/options.html。
- 真的!我相应地确定了我的答案
- 对于任何想知道的人:使用Jupyter时,使用display(df)而不是print(df)
- 这里3代表什么?
- 如果数据帧真的很大,暂时将其写为.csv并使用Jupyter实验室的快速csv查看器可能是有意义的。
- display.max_列的"3"应为"none",以将该选项的上下文参数设置为其默认值。固定的。
无需黑客设置。有一个简单的方法:
- 我不明白为什么其他人的投票比这个多——这对我来说显然是最简单的方式。
- 如果列太多,则不工作
- 你有几列?我检查了1300列,它工作得很好:从itertools导入字符串的组合import ascii_letters df=pd.dataframe(data=[[0]*1326),index=[0],columns=[(a+b)for a,b in combinations(ascii_letters,2)])
- 最简单的解决方案。它不是解决方案或多数投票的唯一原因是它提交的时间要晚得多
- 使用with pd.option_context()选项可以更清楚、更明确地记录正在发生的事情,并清楚地说明如何在输出格式中实现可能需要的其他更改,例如,使用precision、max_colwidth、expand_frame_repr、colheader_justify、date_yearfirst、encoding,以及更多:pandas.pydata.org/pandas docs/stable/options.h。颞下颌关节
- 我更喜欢其他的答案,因为在我的例子中,如果我有很多列,并且我的屏幕不够宽,无法显示它们,那么这看起来很奇怪。列名和数据将进行单独的换行,因此不容易再看到哪些数据属于哪个列名。
- 吻。很好的回答。
- 最好的答案我已经投了一段时间的反对票。如此明显,却又如此虚幻。
- 询问者要求一个"漂亮的印刷体"解决方案。不是这样的。如果这是在Jupyter笔记本电脑中使用的话,内置的漂亮的显示器根本就不会被使用。最好在打印df之前使用pd.set_option('display.max_rows', None)。
- @LS测试了python 3.x jupyter笔记本上的pd.set_选项("display.max_rows",none)和df.to_string(),它们在打印时产生了相同的输出。如果上面的答案对以前的版本不起作用,那么现在就起作用了。
- 这不是公认的答案,因为它不是要求的"漂亮印刷体"。根据定义,这是一种"难看的印刷品",例如,在Jupyter笔记本电脑中不起作用。
当然,如果出现很多这样的情况,就做一个这样的函数。甚至可以配置它在每次启动ipython时加载:https://ipython.org/ipython-doc/1/config/overview.html
1 2 3 4
| def print_full(x):
pd.set_option('display.max_rows', len(x))
print(x)
pd.reset_option('display.max_rows') |
至于着色,过于复杂的颜色对我来说似乎适得其反,但我同意像bootstrap的.table-striped这样的东西会很好。您可以创建一个问题来建议此功能。
- 链接已断开。也许应该是ipython.org/ipython-doc/dev/config/intro.html?
- 如果有人,任何人,甚至是作者,能够验证并修复链接,并将这些评论标记为过时,那就太好了。
- 这是错误的,因为它假定选项在打印操作之前设置为默认值,这不一定是正确的情况,因此可能导致意外的行为。将选项上下文与WITH语句结合使用是更健壮的选项,它将恢复到以前设置的任何内容。
导入熊猫后,作为使用上下文管理器的替代方法,设置用于显示整个数据帧的选项:
1 2 3
| 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 |
有关有用选项的完整列表,请参阅:
1
| pd.describe_option('display') |
- 感谢您添加此项。"如果要显示多个数据帧,则"无"比每个数据帧的实际长度要好得多。
- @corrumpo对于某些选项,如果需要完整表示,则应使用-1int值而不是None
- 在期权名称中添加display.似乎不是必要的。例如,set_option('max_columns')工作得同样好。
使用表格包:
并考虑以下示例用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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时,制表错误。
- @伊劳,谢谢你的信息。你总是有EDOCX1[0]
如果你正在使用ipython笔记本(jupyter)。您可以使用HTML
1 2
| from IPython.core.display import HTML
display(HTML(df.to_html())) |
- 请显示输出以便与其他解决方案tnx进行比较。
- 正是我要找的,谢谢!
试试这个
1 2 3 4
| 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) |
这个答案是Lucidyan先前答案的变体。它通过避免使用set_option使代码更具可读性。
导入熊猫后,作为使用上下文管理器的替代方法,设置用于显示大型数据帧的选项:
1 2 3 4 5 6 7 8
| def set_pandas_options() -> None:
pd.options.display.max_columns = 1000
pd.options.display.max_rows = 1000
pd.options.display.max_colwidth = 199
pd.options.display.width = None
# pd.options.display.precision = 2 # set as needed
set_pandas_options() |
在此之后,如果使用笔记本电脑,您可以使用display(df)或仅使用df,否则可以使用print(df)。
您可以使用下面的方法来实现这一点。只需将数据帧中的列总数作为参数传递给
'display.max_columns'
例如:
1 2 3
| df= DataFrame(..)
with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
print(df) |