如何扩展输出显示以查看 Pandas DataFrame 的更多列?
Posted
技术标签:
【中文标题】如何扩展输出显示以查看 Pandas DataFrame 的更多列?【英文标题】:How do I expand the output display to see more columns of a Pandas DataFrame? 【发布时间】:2012-07-29 07:44:51 【问题描述】:有没有办法在交互式或脚本执行模式下扩大输出的显示范围?
具体来说,我在 Pandas DataFrame
上使用 describe()
函数。当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窗口拖得更大,以及增加“配置空闲”宽度选项,但无济于事。
我使用 Pandas 和 describe()
的目的是避免使用像 Stata 这样的第二个程序来进行基本的数据操作和调查。
【问题讨论】:
Here 是 pandas 的用户指南“选项和设置”,其中包含您正在寻找的示例。 【参考方案1】:更新:Pandas 0.23.4 及以上版本
这不是必需的。如果您设置pd.options.display.width = 0
,Pandas 会自动检测终端窗口的大小。 (旧版本见底部。)
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)
这里是help for set_option
:
旧版本信息。其中大部分已被弃用。
作为@bmu mentioned,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”选项有助于查看每列的未截断形式。
【讨论】:
我自己试过,用 IDLE 也一样,用 pylab 可以正常工作。我为此提出了issue。 display.height:已弃用,请改用display.height
...我陷入了死循环。
现在选项也可以设置为assignments to attributes of pd.options
,例如pd.options.display.max_rows = 999
不推荐使用“display.height”属性。
您可能想要使用option_context,以便选项更改是您正在使用的东西的本地更改。这可以防止在您下次致电.head()
或其他任何内容时意外打印出 400 页垃圾。【参考方案2】:
试试这个:
pd.set_option('display.expand_frame_repr', False)
来自文档:
display.expand_frame_repr : 布尔值
是否跨多行打印宽 DataFrame 的完整 DataFrame repr,仍然尊重 max_columns,但如果宽度超过 display.width,则输出将跨越多个“页面”。 [默认:True] [当前:True]
请参阅:pandas.set_option。
【讨论】:
这个对我有用。似乎熊猫出于某种原因错误地计算了输出宽度,并不必要地破坏了列。 我确实每天都必须这样做......有没有办法在某个地方全局设置这个? @citynorman 请参阅pandas\core\config_init.py
以永久设置它。
在 Anaconda 中,我在 C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core
下找到了 config_init.py
。此外,我必须以管理员身份运行文本编辑器才能保存对文件的更改。【参考方案3】:
如果你想临时设置选项来显示一个大的DataFrame,你可以使用option_context:
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print (df)
退出with
块时会自动恢复选项值。
【讨论】:
为了不设置限制,可以使用None
(而不是999等)。
with pd.option_context('display.max_rows', None, 'display.max_columns', None): print(energy)
不起作用。它并没有改变我想看到的列数。然而,Wouter Overmeiere 的解决方案确实奏效了。
但是有区别,需要一些像-1
或500
这样的数字,而不是None。
使用-1崩溃了,500也没做任何事
+1 用于建议上下文管理器,但 -1 用于 max_rows
值 ;)。将'display.max_rows'
设置为 -1 似乎完全弄乱了格式(对于我的数据没有崩溃,但它现在多次打印某些行)。【参考方案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。
【讨论】:
以上所有更多支持的帖子都使用了在最新版本的 pandas 中重命名和/或禁用的属性。上面的所有 800 票都属于这里。 pipy/pypi 奶酪店草图命名刚刚点击。pd.set_option('max_colwidth', 100)
如果你想指定最大宽度
较新版本的 Pandas 现在采用 None
参数来表示没有最大 colwidth,而不是 -1
正确的语法是:pd.set_option('max_colwidth', None)
原因:FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
【参考方案5】:
使用以下方法设置列最大宽度:
pd.set_option('max_colwidth', 800)
此特定语句将最大宽度设置为每列 800 像素。
【讨论】:
按投票降序向下滚动,这是我第一个让 pandas 不截断 DataFrame 的明文输出的答案。 (熊猫 0.22、iTerm2 3.0.13、OS X 10.12)。 这是唯一对我有用的 Pandas 0.23.2。 为什么不用display.max_colwidth
?这就是它在文档中的列出方式。我同意只有 max_colwidth
有效并且写起来更短,但我很惊讶。【参考方案6】:
您可以使用print df.describe().to_string()
强制它显示整个表格。 (您可以像这样对任何 DataFrame 使用 to_string()
。describe
的结果只是一个 DataFrame 本身。)
8 是 DataFrame 中包含“描述”的行数(因为 describe
计算 8 个统计数据,最小值、最大值、平均值等)。
【讨论】:
【参考方案7】:您可以使用 set_printoptions
调整 Pandas 打印选项。
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
的文档字符串)。
在这种情况下,您可以显式调用to_string
,正如BrenBarn 所回答的那样。
更新
对于 0.10 版,宽数据帧的打印方式changed:
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
【讨论】:
我更喜欢使用 lodagro 提到的 max_columns 方法,但我很高兴您提到了 precision 关键字,因为这将有助于清理显示的统计信息。谢谢!【参考方案8】:您可以设置输出显示以匹配您当前的终端宽度:
pd.set_option('display.width', pd.util.terminal.get_terminal_size()[0])
【讨论】:
@wouter-overmeire 说pandas does this automatically,但情况似乎并非如此,至少在 0.18.0 中不是这样。但是,如果您在终端中使用pd.set_option('display.width', None)
,则为"pandas will correctly auto-detect the width"。
没错!默认情况下它不这样做。将其设置为无,它根本忽略宽度。也许这是 Pandas 中的一个错误,或者它与 gnome 终端有关..?谢谢威尔弗雷德休斯!
AttributeError: module 'pandas.util' has no attribute 'terminal'
@BhishanPoudel 你可以这样做:pd.options.display.width = None
@BhishanPoudel 这个答案已经有几年了,我遇到了和你一样的问题。在撰写本文时,使用 pandas 版本 0.23.1,模块现在是 pd.io.formats.terminal.get_terminal_size()
【参考方案9】:
当数据规模很大时,我使用了这些设置。
# 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)
您可以参考文档here。
【讨论】:
这实际上在 vs_code 中对我来说非常有效 曾在 Google colab 工作过!【参考方案10】:下面的行足以显示数据框中的所有列。
pd.set_option('display.max_columns', None)
【讨论】:
欢迎来到 SO!当您发布一个问题的新答案并且有更多答案时,请尝试向专业人士展示。还有一个答案pd.set_option('display.max_columns', 0)
哪些是你的福利?【参考方案11】:
根据documentation for v0.18.0,如果您在终端中运行(即,不是IPython 笔记本、qtconsole 或IDLE),让 Pandas 自动检测您的屏幕宽度并适应它显示了多少列:
pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)
【讨论】:
这对我有用,谢谢!我正在使用 OS X 10.11.6 上的内置终端应用程序使用 Pandas 0.22.0(截至 2018 年 2 月 8 日的最新版本)【参考方案12】:似乎所有以前的答案都解决了这个问题。还有一点:您可以使用 (auto-complete-able) 代替 pd.set_option('option_name')
:
pd.options.display.width = None
见Pandas documentation: Options and settings:
选项具有完整的“点式”名称,不区分大小写(例如
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_rows
和max_columns
用于__repr__()
方法来决定是否使用to_string()
或info()
将对象呈现为字符串。如果 Python/IPython 在终端中运行,则可以将其设置为 0,并且 pandas 将正确地自动检测终端的宽度并交换为更小的格式,以防所有列垂直不适合。 IPython notebook、IPython qtconsole 或 IDLE 不在终端中运行,因此无法进行正确的自动检测。 ‘None
’值表示无限制。 [强调不是原文]
对于width
参数:
显示的宽度(以字符为单位)。如果 Python/IPython 在终端中运行,则可以将其设置为
None
,pandas 将正确地自动检测宽度。请注意,IPython notebook、IPython qtconsole 或 IDLE 不在终端中运行,因此无法正确检测宽度。
【讨论】:
【参考方案13】: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
【讨论】:
你只需要这两个:(查看上面的例子) import pandas as pd pd.set_option('display.max_columns', 100) pd.set_option('display.width', 1000)跨度> 【参考方案14】:您可以简单地执行以下步骤,
您可以更改 Pandas max_columns 功能的选项,如下所示:
import pandas as pd
pd.options.display.max_columns = 10
(这允许显示 10 列,您可以根据需要进行更改。)
这样,您可以更改需要显示的行数,如下所示(如果您还需要更改最大行数):
pd.options.display.max_rows = 999
(这允许一次打印 999 行。)
请参考the documentation 更改 Pandas 的不同选项/设置。
【讨论】:
【参考方案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】:如果您不想弄乱您的显示选项,并且只想查看这个特定的列列表而不展开您查看的每个数据框,您可以尝试:
df.columns.values
【讨论】:
【参考方案17】:你也可以循环尝试:
for col in df.columns:
print(col)
【讨论】:
解释一下。例如,这如何回答问题“有没有办法在交互式或脚本执行模式下扩大输出显示?”【参考方案18】:pd.options.display.max_columns = 100
您可以根据自己的要求在 max_columns 中指定列数。
【讨论】:
【参考方案19】:下面会在打印 NumPy 数组时增加宽度。
它在Jupyter Notebook 中给出了很好的结果。
import numpy as np
np.set_printoptions(linewidth=160)
【讨论】:
【参考方案20】:这些答案都不适合我。其中一些确实会打印所有列,但看起来很草率。正如所有信息都在那里,但格式不正确。我在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())
【讨论】:
【参考方案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))
)
【讨论】:
以上是关于如何扩展输出显示以查看 Pandas DataFrame 的更多列?的主要内容,如果未能解决你的问题,请参考以下文章
如何打开正确的 devtools 控制台以查看扩展脚本的输出?
Pandas:如何从给定(行,列)对列表的 DataFrame 中检索值?
如何将时间范围绘制为 Pandas 或 MatPlotLib 中的值