如何扩展输出显示以查看 Pandas DataFrame 的更多列?

2024-11-26 08:37:00
admin
原创
263
摘要:问题描述:有没有办法在交互模式或脚本执行模式下扩大输出的显示范围?describe()具体来说,我在 Pandas 上使用该函数DataFrame。当DataFrame有五列(标签)宽时,我会得到我想要的描述性统计数据。但是,如果还有DataFrame更多列,则会抑制统计数据并返回类似以下内容:>>...

问题描述:

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

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”宽度选项,但都无济于事。


解决方案 1:

(对于 0.23.4 之前的 Pandas 版本,请参见底部。)

使用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)

如果您设置了,Pandas 将尝试自动检测您的终端窗口的大小pd.options.display.width = 0

以下是的帮助set_option

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

可用选项:
显示。[chop_threshold,colheader_justify,column_space,date_dayfirst,
         date_yearfirst、encoding、expand_frame_repr、float_format、height、
         行宽、最大列数、最大列宽、最大信息列数、最大信息行数,
         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*),你的代码将来可能会崩溃
如果引入了具有类似名称的新选项,则版本。

价值—— 选项的新价值。

返回
-------
没有任何

加薪
------
如果不存在这样的选项,则会出现 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]
: 字符串/unicode
        默认为控制台检测到的编码。
        指定 to_string 返回的字符串使用的编码,
        这些通常是要显示在控制台上的字符串。
display.expand_frame_repr:[默认:True] [当前:True]
:布尔值
        是否打印出宽 DataFrames 的完整 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]
:整数
        表中列的最大字符宽度
        Pandas 数据结构。当列溢出时,会出现“...”
        占位符嵌入在输出中。
display.max_info_columns:[默认值:100] [当前值:100]
:整数
        max_info_columns 在 DataFrame.info 方法中用于决定是否
        每列信息都将被打印。
display.max_info_rows:[默认值:1690785] [当前值:1690785]
:int 或 None
        max_info_rows 是帧的最大行数
        当报告给控制台时对其列执行空检查。
        默认值为 1,000,000 行。因此,如果 DataFrame 包含更多
        1,000,000 行,则不会对
        列,因此表示将花费更少的时间
        在交互式会话中显示。值为 None 表示始终
        重复时执行空检查。
display.max_rows:[默认值:60] [当前值:500]
:整数
        这设置了 Pandas 打印时应输出的最大行数
        输出各种输出。例如,此值决定 repr()
        对于数据框,可以完整打印出来或者仅打印出摘要。
        “无”值表示无限制。
display.max_seq_items:[默认:无] [当前:无]
:int 或 None

        当漂亮地打印一个长序列时,不会超过“max_seq_items”
        将被打印。如果项目被省略,它们将通过附加标记来表示
        将“...”添加到结果字符串中。

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

        将其设置为“默认”将修改 matplotlib 使用的 rcParams
        默认情况下为图表提供更令人愉悦的视觉风格。
        将其设置为 None / False 可将值恢复为其初始值。
display.multi_sparse:[默认:True] [当前:True]
:布尔值
        “稀疏化”多索引显示(不显示重复的
        组内外层元素)
display.notebook_repr_html:[默认:True] [当前:True]
:布尔值
        当 True 时,IPython 笔记本将使用 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 视为空(旧方法),
        False 表示 None 和 NaN 为空,但 INF、-INF 不为空
        (新方法)。
调用 def: pd.set_option(self, *args, **kwds)

旧版本信息

其中大部分已被弃用。

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

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

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


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

截断列显示

解决方案 2:

尝试一下:

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

来自文档:

display.expand_frame_repr : 布尔值

是否打印出跨多行的宽 DataFrames 的完整 DataFrame repr,仍会考虑 max_columns,但如果宽度超过 display.width,输出将跨越多个“页面”。[默认值:True] [当前:True]

请参阅:pandas.set_option

解决方案 3:

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

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

当您退出该块时,选项值会自动恢复with

解决方案 4:

仅使用以下三行对我有用:

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。

解决方案 5:

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

pd.set_option('max_colwidth', 800)

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

解决方案 6:

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

# 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)

您可以参考此处的文档。

解决方案 7:

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

pd.set_option('display.max_columns', None)

解决方案 8:

您可以使用print df.describe().to_string()强制显示整个表格。(您可以to_string()对任何 DataFrame 使用这种方法。 的结果describe只是一个 DataFrame 本身。)

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

解决方案 9:

您可以使用 调整熊猫打印选项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

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

更新

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

In [3]: df.describe()
Out[3]:
                 x1            x2            x3            x4            x5  \ncount      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

解决方案 10:

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

pd.set_option('display.width', pd.util.terminal.get_terminal_size()[0])

解决方案 11:

您只需执行以下步骤即可,

  • 您可以按如下方式更改 Pandas max_columns功能的选项:

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

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

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

pd.options.display.max_rows = 999

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

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

解决方案 12:

根据v0.18.0 的文档,如果你在终端中运行(即不是IPython notebook、qtconsole 或IDLE),只需两行代码就可以让 Pandas 自动检测你的屏幕宽度并动态调整显示的列数:

pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)

解决方案 13:

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

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 笔记本、IPython qtconsole 或 IDLE 不在终端中运行,因此无法进行正确的自动检测。' None' 值表示无限制。 [原文中没有强调]

对于width参数:

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

解决方案 14:

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

解决方案 15:

您可以使用此自定义函数来显示 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整个笔记本,而只需将其用于单个单元格即可。

解决方案 16:

要在笔记本中使用上下文,

from IPython.display import display

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

*根据之前的回答

解决方案 17:

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

df.columns.values

解决方案 18:

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

它在 Jupyter Notebook 中取得了良好的结果。

import numpy as np
np.set_printoptions(linewidth=120)

为了增加Pandas对象的打印区域(例如索引):

import pandas as pd
pd.set_option('display.width', 120)

解决方案 19:

您也可以循环尝试:

for col in df.columns: 
    print(col) 

解决方案 20:

pd.options.display.max_columns = 100

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

解决方案 21:

严格来说,这不是答案,但我们记住我们可以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))
    )

解决方案 22:

这些答案对我都不起作用。其中几个确实会打印所有列,但看起来很草率。因为所有信息都在那里,但格式不正确。我在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())

解决方案 23:

如果想要查看特定列的所有行,只需选择具有列名的数据框,然后使用 tolist 方法。

pd['column_name'].tolist()

这会将 pandas 系列转换为 python 列表。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用