我经常在终端上使用 Series 和 DataFrames。Series的默认值__repr__
返回一个缩减的样本,带有一些头部和尾部值,但其余的缺失。
有没有一种内置方法可以漂亮地打印整个系列/数据帧?理想情况下,它将支持正确的对齐方式,可能是列之间的边界,甚至可能支持不同列的颜色编码。
您还可以将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 丰富的显示逻辑(就像这样)。
无需破解设置。有一个简单的方法:
print(df.to_string())
当然,如果这种情况很多,请制作一个这样的功能。您甚至可以将其配置为每次启动 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
东西会很好。您总是可以创建一个问题来建议此功能。
导入 pandas 后,作为使用上下文管理器的替代方法,设置此类选项以显示整个数据框:
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')
使用表格包:
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.options.display
这个答案是lucidyan 先前答案的变体。它通过避免使用set_option
.
导入 pandas 后,作为使用上下文管理器的替代方法,设置此类选项以显示大型数据框:
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_string
。Series.to_string
to_markdown
如果你需要的是 markdown 输出,Pandas 1.0.0 有DataFrame.to_markdown
和Series.to_markdown
方法。
to_html
如果您需要的是 HTML 输出,Pandas 0.25.3 确实有一个DataFrame.to_html
方法,但没有一个Series.to_html
. 请注意, aSeries
可以转换为 a DataFrame
。
如果您使用的是 Ipython Notebook (Jupyter)。您可以使用 HTML
from IPython.core.display import HTML
display(HTML(df.to_html()))
尝试这个
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)
创建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 的作者之一
您可以设置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)
有关更多详细信息,请阅读如何漂亮打印 Pandas 数据帧和系列
没有人提出过这种简单的纯文本解决方案:
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 笔记本时,这是一个很好的解决方案。
注意:pd.Series()
没有.to_html()
所以必须转换为pd.DataFrame()
from IPython.display import display, HTML
display(HTML(s.to_frame().to_html()))
产生如下结果:
您可以使用以下方法实现此目的。只要通过总数。DataFrame 中作为 arg 存在的列数
'display.max_columns'
例如:
df= DataFrame(..)
with pd.option_context('display.max_rows', None, 'display.max_columns', df.shape[1]):
print(df)
尝试使用 display() 函数。这将自动使用水平和垂直滚动条,这样您就可以轻松地显示不同的数据集,而不是使用 print()。
display(dataframe)
display() 也支持正确对齐。
但是,如果您想让数据集更漂亮,您可以检查pd.option_context()
. 它有很多选项可以清楚地显示数据框。
注意 - 我正在使用 Jupyter Notebooks。