ChatGPT解决这个技术问题 Extra ChatGPT

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

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

具体来说,我在 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 的用户指南“选项和设置”,其中包含您正在寻找的示例。

P
Peter Mortensen

更新:熊猫 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

set_option(pat,value) - Sets the value of the specified option

Available options:
display.[chop_threshold, colheader_justify, column_space, date_dayfirst,
         date_yearfirst, encoding, expand_frame_repr, float_format, height,
         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, precision, width]
mode.[sim_interactive, use_inf_as_null]

Parameters
----------
pat - str/regexp which should match a single option.

Note: partial matches are supported for convenience, but unless you use the
full option name (e.g., *x.y.z.option_name*), your code may break in future
versions if new options with similar names are introduced.

value - new value of option.

Returns
-------
None

Raises
------
KeyError if no such option exists

display.chop_threshold: [default: None] [currently: None]
: float or None
        if set to a float value, all float values smaller then the given threshold
        will be displayed as exactly 0 by repr and friends.
display.colheader_justify: [default: right] [currently: right]
: 'left'/'right'
        Controls the justification of column headers. used by DataFrameFormatter.
display.column_space: [default: 12] [currently: 12]No description available.

display.date_dayfirst: [default: False] [currently: False]
: boolean
        When True, prints and parses dates with the day first, eg 20/01/2005
display.date_yearfirst: [default: False] [currently: False]
: boolean
        When True, prints and parses dates with the year first, e.g., 2005/01/20
display.encoding: [default: UTF-8] [currently: UTF-8]
: str/unicode
        Defaults to the detected encoding of the console.
        Specifies the encoding to be used for strings returned by to_string,
        these are generally strings meant to be displayed on the console.
display.expand_frame_repr: [default: True] [currently: True]
: boolean
        Whether to print out the full DataFrame repr for wide DataFrames
        across multiple lines, `max_columns` is still respected, but the output will
        wrap-around across multiple "pages" if it's width exceeds `display.width`.
display.float_format: [default: None] [currently: None]
: callable
        The callable should accept a floating point number and return
        a string with the desired format of the number. This is used
        in some places like SeriesFormatter.
        See core.format.EngFormatter for an example.
display.height: [default: 60] [currently: 1000]
: int
        Deprecated.
        (Deprecated, use `display.height` instead.)

display.line_width: [default: 80] [currently: 1000]
: int
        Deprecated.
        (Deprecated, use `display.width` instead.)

display.max_columns: [default: 20] [currently: 500]
: int
        max_rows and max_columns are used in __repr__() methods to decide if
        to_string() or info() is used to render an object to a string.  In case
        python/IPython is running in a terminal this can be set to 0 and Pandas
        will correctly auto-detect the width the terminal and swap to a smaller
        format in case all columns would not fit vertically. The IPython notebook,
        IPython qtconsole, or IDLE do not run in a terminal and hence it is not
        possible to do correct auto-detection.
        'None' value means unlimited.
display.max_colwidth: [default: 50] [currently: 50]
: int
        The maximum width in characters of a column in the repr of
        a Pandas data structure. When the column overflows, a "..."
        placeholder is embedded in the output.
display.max_info_columns: [default: 100] [currently: 100]
: int
        max_info_columns is used in DataFrame.info method to decide if
        per column information will be printed.
display.max_info_rows: [default: 1690785] [currently: 1690785]
: int or None
        max_info_rows is the maximum number of rows for which a frame will
        perform a null check on its columns when repr'ing To a console.
        The default is 1,000,000 rows. So, if a DataFrame has more
        1,000,000 rows there will be no null check performed on the
        columns and thus the representation will take much less time to
        display in an interactive session. A value of None means always
        perform a null check when repr'ing.
display.max_rows: [default: 60] [currently: 500]
: int
        This sets the maximum number of rows Pandas should output when printing
        out various output. For example, this value determines whether the repr()
        for a dataframe prints out fully or just a summary repr.
        'None' value means unlimited.
display.max_seq_items: [default: None] [currently: None]
: int or None

        when pretty-printing a long sequence, no more then `max_seq_items`
        will be printed. If items are ommitted, they will be denoted by the addition
        of "..." to the resulting string.

        If set to None, the number of items to be printed is unlimited.
display.mpl_style: [default: None] [currently: None]
: bool

        Setting this to 'default' will modify the rcParams used by matplotlib
        to give plots a more pleasing visual style by default.
        Setting this to None/False restores the values to their initial value.
display.multi_sparse: [default: True] [currently: True]
: boolean
        "sparsify" MultiIndex display (don't display repeated
        elements in outer levels within groups)
display.notebook_repr_html: [default: True] [currently: True]
: boolean
        When True, IPython notebook will use html representation for
        Pandas objects (if it is available).
display.pprint_nest_depth: [default: 3] [currently: 3]
: int
        Controls the number of nested levels to process when pretty-printing
display.precision: [default: 7] [currently: 7]
: int
        Floating point output precision (number of significant digits). This is
        only a suggestion
display.width: [default: 80] [currently: 1000]
: int
        Width of the display in characters. In case python/IPython is running in
        a terminal this can be set to None and Pandas will correctly auto-detect the
        width.
        Note that the IPython notebook, IPython qtconsole, or IDLE do not run in a
        terminal and hence it is not possible to correctly detect the width.
mode.sim_interactive: [default: False] [currently: False]
: boolean
        Whether to simulate interactive mode for purposes of testing
mode.use_inf_as_null: [default: False] [currently: False]
: boolean
        True means treat None, NaN, INF, -INF as null (old way),
        False means None and NaN are null, but INF, -INF are not null
        (new way).
Call def:   pd.set_option(self, *args, **kwds)

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

正如@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' 选项有助于查看每列的未截断形式。

https://i.stack.imgur.com/J412l.png


尝试过自己并在 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 页垃圾。
P
Peter Mortensen

尝试这个:

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

从文档中:

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

请参阅:pandas.set_option


这个对我有用。似乎熊猫出于某种原因错误地计算了输出宽度,并不必要地破坏了列。
我真的每天都必须这样做......有没有办法在某个地方全局设置它?
@citynorman 请参阅 pandas\core\config_init.py 以永久设置它。
在 Anaconda 中,我在 C:\ProgramData\Anaconda3\Lib\site-packages\pandas\core 下找到了 config_init.py。此外,我必须以管理员身份运行文本编辑器才能保存对文件的更改。
伙计,我几个月来一直在寻找这个该死的命令!!!!谢谢!!!!!!!!!!!!
j
jezrael

如果要临时设置选项以显示一个大的 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 的解决方案确实奏效了。
但是有区别,需要一些像 -1500 这样的数字,而不是 None。
使用 -1 崩溃,并且 500 也没有做任何事情
+1 用于建议上下文管理器,但 -1 用于 max_rows 值;)。将 'display.max_rows' 设置为 -1 似乎完全弄乱了格式(对于我的数据没有崩溃,但它现在多次打印某些行)。
P
Peter Mortensen

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

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.
P
Peter Mortensen

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

pd.set_option('max_colwidth', 800)

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


按降序向下滚动,这是我第一个让熊猫不截断 DataFrames 的明文输出的答案。 (熊猫 0.22、iTerm2 3.0.13、OS X 10.12)。
这是唯一对我有用的 Pandas 0.23.2。
为什么您不必将其指定为 display.max_colwidth?这就是它在文档中的列出方式。我同意只有 max_colwidth 有效并且写起来更短,但我很惊讶。
B
BrenBarn

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

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


P
Peter Mortensen

您可以使用 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 的文档字符串)。在这种情况下,您可以按照 BrenBarn 的回答显式调用 to_string

更新

使用 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 关键字,因为这将有助于清理显示的统计信息。谢谢!
P
Peter Mortensen

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

# 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 中对我来说非常有效
也在谷歌colab工作过!
W
Wilfred Hughes

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

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:模块“pandas.util”没有属性“终端”
@BhishanPoudel 你可以这样做:pd.options.display.width = None
@BhishanPoudel这个答案已经有几年了,我遇到了和你一样的问题。在撰写本文时,使用 pandas 版本 0.23.1,该模块现在是 pd.io.formats.terminal.get_terminal_size()
P
Peter Mortensen

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

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

欢迎来到 SO!当您发布一个问题的新答案并且有更多答案时,请尝试向专业人士展示。还有一个答案pd.set_option('display.max_columns', 0)哪些是您的优势?
P
Peter Mortensen

根据 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 日)
P
Peter Mortensen

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

pd.options.display.width = None

请参阅Pandas documentation: Options and settings

选项有一个完整的“点式”,不区分大小写的名称(例如 display.max_rows)。您可以直接获取/设置选项作为顶级选项属性的属性: In [1]: import pandas as pd In [2]: pd.options.display.max_rows Out[2]: 15 In [3]: pd .options.display.max_rows = 999 输入 [4]:pd.options.display.max_rows 输出[4]:999

[...]

对于 max_... 参数:

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

对于 width 参数:

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


P
Peter Mortensen
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)
P
Peter Mortensen

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

您可以更改 Pandas max_columns 功能的选项,如下所示: import pandas as pd pd.options.display.max_columns = 10 (这允许显示 10 列,您可以根据需要进行更改。)

像这样,您可以更改需要显示的行数,如下所示(如果您还需要更改最大行数): pd.options.display.max_rows = 999 (这允许一次打印 999 行。)

请参阅 the documentation 更改 Pandas 的不同选项/设置。


P
Peter Mortensen

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


A
AreToo

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

df.columns.values

l
lifeisbeautiful

您也可以循环尝试:

for col in df.columns: 
    print(col) 

一个解释将是有序的。例如,这如何回答“有没有办法在交互或脚本执行模式下扩大输出显示?”这个问题?
N
Nisrin Dhoondia
pd.options.display.max_columns = 100

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


P
Peter Mortensen

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

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

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

P
Peter Mortensen

这些答案都不适合我。其中一些确实会打印所有列,但看起来很草率。与所有信息一样,但格式不正确。我在 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())

P
Peruz

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