850

有没有办法在交互式或脚本执行模式下扩大输出显示?

具体来说,我describe()在 Pandas 上使用该函数DataFrame。当DataFrame是五列(标签)宽时,我得到了我想要的描述性统计信息。但是,如果DataFrame有更多列,则统计信息将被抑制并返回如下内容:

>> Index: 8 entries, count to max
>> Data columns:
>> x1          8  non-null values
>> x2          8  non-null values
>> x3          8  non-null values
>> x4          8  non-null values
>> x5          8  non-null values
>> x6          8  non-null values
>> x7          8  non-null values

无论是 6 列还是 7 列,都会给出“8”值。“8”指的是什么?

我已经尝试将IDLE窗口拖得更大,以及增加“配置 IDLE”宽度选项,但无济于事。

我使用 Pandas 的目的describe()是避免使用像 Stata 这样的第二个程序来进行基本的数据操作和调查。

4

21 回答 21

1223

更新:熊猫 0.23.4 起

这不是必需的。如果你设置了,Pandas 会自动检测终端窗口的大小pd.options.display.width = 0。(对于旧版本,请参阅底部。)

pandas.set_printoptions(...)已弃用。相反,使用pandas.set_option(optname, val),或等效地使用pd.options.<opt.hierarchical.name> = val。像:

import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

这里是帮助set_option

set_option(pat,value) - 设置指定选项的值

可用选项:
display.[chop_threshold, colheader_justify, column_space, date_dayfirst,
         date_yearfirst,编码,expand_frame_repr,float_format,高度,
         line_width, max_columns, max_colwidth, max_info_columns, max_info_rows,
         max_rows,max_seq_items,mpl_style,multi_sparse,notebook_repr_html,
         pprint_nest_depth,精度,宽度]
模式。[sim_interactive,use_inf_as_null]

参数
----------
pat - str/regexp 应该匹配一个选项。

注意:为方便起见,支持部分匹配,但除非您使用
完整的选项名称(例如,*xyzoption_name*),您的代码将来可能会中断
如果引入了具有相似名称的新选项的版本。

value - 期权的新价值。

退货
--------
没有任何

加注
------
KeyError 如果不存在这样的选项

display.chop_threshold:[默认:无] [当前:无]
:浮动或无
        如果设置为浮点值,则所有浮点值都小于给定阈值
        repr 和朋友将显示为 0。
display.colheader_justify:[默认:正确] [当前:正确]
: '左右'
        控制列标题的对齐方式。由 DataFrameFormatter 使用。
display.column_space:[默认:12] [当前:12]没有可用的描述。

display.date_dayfirst:[默认:False] [当前:False]
: 布尔值
        如果为 True,则打印并解析日期,例如 20/01/2005
display.date_yearfirst:[默认:False] [当前:False]
: 布尔值
        如果为 True,则打印和解析日期,首先是年份,例如 2005/01/20
display.encoding:[默认:UTF-8] [当前:UTF-8]
: str/unicode
        默认为检测到的控制台编码。
        指定用于 to_string 返回的字符串的编码,
        这些通常是要在控制台上显示的字符串。
display.expand_frame_repr:[默认:真] [当前:真]
: 布尔值
        是否为宽 DataFrame 打印出完整的 DataFrame repr
        跨越多行,`max_columns` 仍然受到尊重,但输出将
        如果宽度超过 `display.width`,则环绕多个“页面”。
display.float_format:[默认:无] [当前:无]
: 可调用
        可调用对象应该接受一个浮点数并返回
        具有所需数字格式的字符串。这是使用
        在像 SeriesFormatter 这样的地方。
        有关示例,请参见 core.format.EngFormatter。
display.height:[默认:60] [当前:1000]
: 整数
        已弃用。
        (已弃用,请改用 `display.height`。)

display.line_width:[默认:80] [当前:1000]
: 整数
        已弃用。
        (已弃用,请改用`display.width`。)

display.max_columns:[默认:20] [当前:500]
: 整数
        max_rows 和 max_columns 用于 __repr__() 方法来决定是否
        to_string() 或 info() 用于将对象呈现为字符串。如果
        python/IPython 在终端中运行,可以设置为 0 和 Pandas
        将正确地自动检测终端的宽度并换成更小的
        格式以防所有列垂直不适合。IPython 笔记本,
        IPython qtconsole 或 IDLE 不在终端中运行,因此它不是
        可以进行正确的自动检测。
        “无”值意味着无限。
display.max_colwidth:[默认:50] [当前:50]
: 整数
        repr 中列的最大字符宽度
        熊猫数据结构。当列溢出时,一个“...”
        占位符嵌入在输出中。
display.max_info_columns:[默认:100] [当前:100]
: 整数
        在 DataFrame.info 方法中使用 max_info_columns 来决定是否
        将打印每列信息。
display.max_info_rows:[默认:1690785] [当前:1690785]
: 整数或无
        max_info_rows 是一个帧的最大行数
        repr'ing 到控制台时对其列执行空检查。
        默认值为 1,000,000 行。所以,如果一个 DataFrame 有更多
        1,000,000 行不会对
        列,因此表示将花费更少的时间
        在交互式会话中显示。None 的值意味着总是
        repr'ing 时执行空检查。
display.max_rows:[默认:60] [当前:500]
: 整数
        这设置打印时 Pandas 应该输出的最大行数
        出各种输出。例如,这个值决定了 repr()
        对于数据框,可以完全打印出来,也可以只打印出摘要 repr。
        “无”值意味着无限。
display.max_seq_items:[默认:无] [当前:无]
: 整数或无

        当漂亮地打印一个长序列时,不超过 `max_seq_items`
        将被打印。如果项目被省略,它们将由加号表示
        的“...”到结果字符串。

        如果设置为无,则要打印的项目数不受限制。
display.mpl_style:[默认:无] [当前:无]
: 布尔

        将此设置为“默认”将修改 matplotlib 使用的 rcParams
        默认情况下为绘图提供更令人愉悦的视觉风格。
        将此设置为 None/False 会将值恢复为其初始值。
display.multi_sparse:[默认:True] [当前:True]
: 布尔值
        "sparsify" MultiIndex 显示(不重复显示
        组内外部级别的元素)
display.notebook_repr_html:[默认:真] [当前:真]
: 布尔值
        当 True 时,IPython notebook 将使用 html 表示
        Pandas 对象(如果可用)。
display.pprint_nest_depth:[默认:3] [当前:3]
: 整数
        控制漂亮打印时要处理的嵌套级别数
display.precision:[默认值:7] [当前:7]
: 整数
        浮点输出精度(有效位数)。这是
        只是一个建议
display.width:[默认:80] [当前:1000]
: 整数
        显示的宽度(以字符为单位)。如果 python/IPython 正在运行
        可以将其设置为 None 的终端,Pandas 将正确地自动检测
        宽度。
        请注意,IPython notebook、IPython qtconsole 或 IDLE 不在
        终端,因此无法正确检测宽度。
mode.sim_interactive:[默认:False] [当前:False]
: 布尔值
        是否为了测试目的模拟交互模式
mode.use_inf_as_null:[默认:False] [当前:False]
: 布尔值
        True 表示将 None、NaN、INF、-INF 视为 null(旧方式),
        False 表示 None 和 NaN 为空,但 INF、-INF 不为空
        (新方法)。
调用 def: pd.set_option(self, *args, **kwds)

旧版本信息。其中大部分已被弃用。

正如@bmu提到的,Pandas 自动检测(默认情况下)显示区域的大小,当对象 repr 不适合显示时,将使用摘要视图。您提到了调整 IDLE 窗口的大小,但没有效果。如果你这样做print df.describe().to_string(),它是否适合空闲窗口?

终端大小由pandas.util.terminal.get_terminal_size()(已弃用和删除)确定,这将返回一个包含(width, height)显示的元组。输出是否与 IDLE 窗口的大小匹配?可能存在问题(之前在 Emacs 中运行终端时存在问题)。

请注意,可以绕过自动检测,pandas.set_printoptions(max_rows=200, max_columns=10)如果行数、列数不超过给定限制,则永远不会切换到摘要视图。


'max_colwidth' 选项有助于查看每列的未截断形式。

截断列显示

于 2012-07-29T18:02:02.687 回答
251

试试这个:

pd.set_option('display.expand_frame_repr', False)

从文档中:

display.expand_frame_repr : 布尔值

是否为跨多行的宽 DataFrame 打印完整的 DataFrame repr,仍然尊重 max_columns,但如果其宽度超过 display.width,则输出将跨越多个“页面”。[默认:真] [当前:真]

请参阅:pandas.set_option

于 2014-08-20T22:19:24.467 回答
177

如果要临时设置选项以显示一个大的 DataFrame,可以使用option_context

with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print (df)

with退出块时会自动恢复选项值。

于 2015-10-27T18:04:34.610 回答
135

只有使用这三行对我有用:

pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('max_colwidth', -1)

它适用于Anaconda、Python 3.6.5、Pandas 0.23.0 和 Visual Studio Code 1.26。

于 2018-07-26T14:10:51.573 回答
66

使用以下方法设置列最大宽度:

pd.set_option('max_colwidth', 800)

此特定语句将最大宽度设置为每列 800 像素。

于 2015-11-19T08:43:35.197 回答
28

您可以使用print df.describe().to_string()它来强制它显示整个表格。(你可以to_string()像这样对任何 DataFrame 使用。结果describe只是一个 DataFrame 本身。)

8 是 DataFrame 中包含“描述”的行数(因为describe计算 8 个统计数据,最小值、最大值、平均值等)。

于 2012-07-29T08:03:35.063 回答
28

您可以使用 调整 Pandas 打印选项set_printoptions

In [3]: df.describe()
Out[3]:
<class 'pandas.core.frame.DataFrame'>
Index: 8 entries, count to max
Data columns:
x1    8  non-null values
x2    8  non-null values
x3    8  non-null values
x4    8  non-null values
x5    8  non-null values
x6    8  non-null values
x7    8  non-null values
dtypes: float64(7)

In [4]: pd.set_printoptions(precision=2)

In [5]: df.describe()
Out[5]:
            x1       x2       x3       x4       x5       x6       x7
count      8.0      8.0      8.0      8.0      8.0      8.0      8.0
mean   69024.5  69025.5  69026.5  69027.5  69028.5  69029.5  69030.5
std       17.1     17.1     17.1     17.1     17.1     17.1     17.1
min    69000.0  69001.0  69002.0  69003.0  69004.0  69005.0  69006.0
25%    69012.2  69013.2  69014.2  69015.2  69016.2  69017.2  69018.2
50%    69024.5  69025.5  69026.5  69027.5  69028.5  69029.5  69030.5
75%    69036.8  69037.8  69038.8  69039.8  69040.8  69041.8  69042.8
max    69049.0  69050.0  69051.0  69052.0  69053.0  69054.0  69055.0

to_string但是,这并非在所有情况下都有效,因为 Pandas 会检测您的控制台宽度,并且仅当输出适合控制台时才会使用(请参阅 的文档字符串set_printoptions)。在这种情况下,您可以显式调用BrenBarnto_string的回答。

更新

在 0.10 版中,宽数据帧的打印方式发生了变化

In [3]: df.describe()
Out[3]:
                 x1            x2            x3            x4            x5  \
count      8.000000      8.000000      8.000000      8.000000      8.000000
mean   59832.361578  27356.711336  49317.281222  51214.837838  51254.839690
std    22600.723536  26867.192716  28071.737509  21012.422793  33831.515761
min    31906.695474   1648.359160     56.378115  16278.322271     43.745574
25%    45264.625201  12799.540572  41429.628749  40374.273582  29789.643875
50%    56340.214856  18666.456293  51995.661512  54894.562656  47667.684422
75%    75587.003417  31375.610322  61069.190523  67811.893435  76014.884048
max    98136.474782  84544.484627  91743.983895  75154.587156  99012.695717

                 x6            x7
count      8.000000      8.000000
mean   41863.000717  33950.235126
std    38709.468281  29075.745673
min     3590.990740   1833.464154
25%    15145.759625   6879.523949
50%    22139.243042  33706.029946
75%    72038.983496  51449.893980
max    98601.190488  83309.051963

此外,设置 Pandas 选项的 API 发生了变化:

In [4]: pd.set_option('display.precision', 2)

In [5]: df.describe()
Out[5]:
            x1       x2       x3       x4       x5       x6       x7
count      8.0      8.0      8.0      8.0      8.0      8.0      8.0
mean   59832.4  27356.7  49317.3  51214.8  51254.8  41863.0  33950.2
std    22600.7  26867.2  28071.7  21012.4  33831.5  38709.5  29075.7
min    31906.7   1648.4     56.4  16278.3     43.7   3591.0   1833.5
25%    45264.6  12799.5  41429.6  40374.3  29789.6  15145.8   6879.5
50%    56340.2  18666.5  51995.7  54894.6  47667.7  22139.2  33706.0
75%    75587.0  31375.6  61069.2  67811.9  76014.9  72039.0  51449.9
max    98136.5  84544.5  91744.0  75154.6  99012.7  98601.2  83309.1
于 2012-07-29T10:56:01.317 回答
23

您可以设置输出显示以匹配您当前的终端宽度:

pd.set_option('display.width', pd.util.terminal.get_terminal_size()[0])
于 2015-03-16T10:04:56.283 回答
18

当数据规模很大时,我使用了这些设置。

# Environment settings: 
pd.set_option('display.max_column', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_seq_items', None)
pd.set_option('display.max_colwidth', 500)
pd.set_option('expand_frame_repr', True)

你可以参考这里的文档。

于 2018-08-27T14:14:20.987 回答
15

下面的行足以显示数据框中的所有列。

pd.set_option('display.max_columns', None)
于 2019-11-05T06:31:11.957 回答
14

根据v0.18.0 的文档,如果您在终端中运行(即,不是IPython笔记本、qtconsole 或IDLE),让 Pandas 自动检测您的屏幕宽度并动态调整多少列是一个两行表明:

pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)
于 2016-04-02T13:26:39.270 回答
8

似乎所有先前的答案都解决了这个问题。还有一点:您可以使用 (auto-complete-able) 代替pd.set_option('option_name'):

pd.options.display.width = None

请参阅Pandas 文档:选项和设置

选项具有完整的“点式”、不区分大小写的名称(例如 display.max_rows)。您可以直接获取/设置选项作为顶级属性的options属性:

In [1]: import pandas as pd

In [2]: pd.options.display.max_rows
Out[2]: 15

In [3]: pd.options.display.max_rows = 999

In [4]: pd.options.display.max_rows
Out[4]: 999

[...]

对于max_...参数:

max_rowsmax_columns__repr__()方法中使用来决定是否to_string()info()用于将对象呈现为字符串。如果 Python/ IPython在终端中运行,则可以将其设置为 0,pandas 将正确地自动检测终端的宽度并交换为更小的格式,以防所有列垂直不适合。IPython notebook、IPython qtconsole 或 IDLE 不在终端中运行,因此无法进行正确的自动检测。'<code>None' 值表示无限制。【重点不在原文】

对于width参数:

显示的宽度(以字符为单位)。如果 Python/IPython 在终端中运行,可以将其设置为None,pandas 将正确地自动检测宽度。请注意,IPython notebook、IPython qtconsole 或IDLE不在终端中运行,因此无法正确检测宽度。

于 2018-03-23T16:52:02.203 回答
8
import pandas as pd
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 1000)

SentenceA = "William likes Piano and Piano likes William"
SentenceB = "Sara likes Guitar"
SentenceC = "Mamoosh likes Piano"
SentenceD = "William is a CS Student"
SentenceE = "Sara is kind"
SentenceF = "Mamoosh is kind"


bowA = SentenceA.split(" ")
bowB = SentenceB.split(" ")
bowC = SentenceC.split(" ")
bowD = SentenceD.split(" ")
bowE = SentenceE.split(" ")
bowF = SentenceF.split(" ")

# Creating a set consisting of all words

wordSet = set(bowA).union(set(bowB)).union(set(bowC)).union(set(bowD)).union(set(bowE)).union(set(bowF))
print("Set of all words is: ", wordSet)

# Initiating dictionary with 0 value for all BOWs

wordDictA = dict.fromkeys(wordSet, 0)
wordDictB = dict.fromkeys(wordSet, 0)
wordDictC = dict.fromkeys(wordSet, 0)
wordDictD = dict.fromkeys(wordSet, 0)
wordDictE = dict.fromkeys(wordSet, 0)
wordDictF = dict.fromkeys(wordSet, 0)

for word in bowA:
    wordDictA[word] += 1
for word in bowB:
    wordDictB[word] += 1
for word in bowC:
    wordDictC[word] += 1
for word in bowD:
    wordDictD[word] += 1
for word in bowE:
    wordDictE[word] += 1
for word in bowF:
    wordDictF[word] += 1

# Printing term frequency

print("SentenceA TF: ", wordDictA)
print("SentenceB TF: ", wordDictB)
print("SentenceC TF: ", wordDictC)
print("SentenceD TF: ", wordDictD)
print("SentenceE TF: ", wordDictE)
print("SentenceF TF: ", wordDictF)

print(pd.DataFrame([wordDictA, wordDictB, wordDictB, wordDictC, wordDictD, wordDictE, wordDictF]))

输出:

   CS  Guitar  Mamoosh  Piano  Sara  Student  William  a  and  is  kind  likes
0   0       0        0      2     0        0        2  0    1   0     0      2
1   0       1        0      0     1        0        0  0    0   0     0      1
2   0       1        0      0     1        0        0  0    0   0     0      1
3   0       0        1      1     0        0        0  0    0   0     0      1
4   1       0        0      0     0        1        1  1    0   1     0      0
5   0       0        0      0     1        0        0  0    0   1     1      0
6   0       0        1      0     0        0        0  0    0   1     1      0
于 2018-11-23T10:11:59.217 回答
7

您可以简单地执行以下步骤,

  • 您可以更改 Pandas max_columns功能的选项,如下所示:

    import pandas as pd
    pd.options.display.max_columns = 10
    

    (这允许显示 10 列,您可以根据需要进行更改。)

  • 像这样,您可以更改需要显示的行数,如下所示(如果您还需要更改最大行数):

    pd.options.display.max_rows = 999
    

    (这允许一次打印 999 行。)

请参阅文档以更改 Pandas 的不同选项/设置。

于 2019-11-28T10:44:10.730 回答
5

您可以使用此自定义函数来显示 Pandas 的内容Dataframe

def display_all(df):     # For any Dataframe df
   with pd.option_context('display.max_rows',1000): # Change number of rows accordingly
      with pd.option_context('display.max_columns',1000): # Change number of columns accordingly
          display(df)

display_all(df.head()) # Pass this function to your dataframe and voilà!

您不必pd.set_option将整个笔记本用于单个单元格。

于 2020-07-17T08:21:32.443 回答
4

如果您不想弄乱您的显示选项并且只想查看这个特定的列列表而不展开您查看的每个数据框,您可以尝试:

df.columns.values
于 2019-02-28T22:21:03.463 回答
2

您也可以循环尝试:

for col in df.columns: 
    print(col) 
于 2019-05-21T16:23:00.493 回答
2
pd.options.display.max_columns = 100

您可以根据您的要求在 max_columns 中指定列数。

于 2020-07-01T11:10:16.840 回答
2

下面将在打印 NumPy 数组时增加宽度。

它在Jupyter Notebook中给出了很好的结果。

import numpy as np
np.set_printoptions(linewidth=160)
于 2021-03-25T08:34:41.377 回答
0

这些答案都不适合我。其中一些确实会打印所有列,但看起来很草率。与所有信息一样,但格式不正确。我在Neovim内部使用终端,所以我怀疑这就是原因。

这个迷你函数完全符合我的需要,只需df_data在两个地方更改它的数据框名称(col_range设置为 pandas 自然显示的内容,对我来说是 5,但对你来说可能更大或更小)。

import math
col_range = 5
for _ in range(int(math.ceil(len(df_data.columns)/col_range))):
    idx1 = _*col_range
    idx2 = idx1+col_range
    print(df_data.iloc[:, idx1:idx2].describe())
于 2020-09-16T07:20:57.603 回答
0

严格来说,这不是答案,但让我们记住我们可以df.describe().transpose()或什df.head(n).transpose()至,或df.tail(n).transpose()

我还发现在结构化标题时更容易将标题作为一列阅读:

header1_xxx,

header2_xxx,

header3_xxx,

我认为终端和应用程序更自然地处理垂直滚动,如果在转置后这是必要的。

标题通常大于它们的值,将它们全部放在一列(索引)中可以最大限度地减少它们对总表宽度的影响。

最后也可以合并其他 df 描述,这是一个可能的想法:

def df_overview(df: pd.DataFrame, max_colwidth=25, head=3, tail=3):
    return(
        df.describe([0.5]).transpose()
        .merge(df.dtypes.rename('dtypes'), left_index=True, right_index=True)
        .merge(df.head(head).transpose(), left_index=True, right_index=True)
        .merge(df.tail(tail).transpose(), left_index=True, right_index=True)
        .to_string(max_colwidth=max_colwidth, float_format=lambda x: "{:.4G}".format(x))
    )
于 2022-01-28T19:00:41.710 回答