pandas 如何在不丢失格式的情况下在终端中打印 df?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/38487945/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 01:38:17  来源:igfitidea点击:

How to print a df in Terminal without loosing format?

pythonshellpandasprintingdataframe

提问by Yared J.

How can I print a df in the Terminal without loosing the format?

如何在不丢失格式的情况下在终端中打印 df?

Lets say I have a df like this:

假设我有一个这样的 df:

In: df
Out:

    TFs No Esenciales  Genes regulados  Genes Regulados Positivamente  Genes Regulados Negativamente  No Tentativo de genes a silenciar  No Real de genes a silenciar  No Tentativo de genes a inducir
146              YdeO               20                             18                              2                              2                               2                               0

But when I use print to display it in the shell, It looses its format

但是当我使用 print 在 shell 中显示它时,它失去了它的格式

In: print (df)
Out:
        TFs No Esenciales  Genes regulados  Genes Regulados Positivamente  \
146              YdeO               20                             18   

     Genes Regulados Negativamente  No Tentativo de genes a silenciar  \
146                              2                                 2   

     No Real de genes a silenciar  No Tentativo de genes a inducir  \
146                            2                               0   

     No Real de genes a inducir  Balance de genes  Balance real de genes  
146                          0                 2                      2  

How can I use print, but keep the format?

如何使用打印,但保留格式?

My desired output is:

我想要的输出是:

In: print (df)
    Out:

    TFs No Esenciales  Genes regulados  Genes Regulados Positivamente  Genes Regulados Negativamente  No Tentativo de genes a silenciar  No Real de genes a silenciar  No Tentativo de genes a inducir
146              YdeO               20                             18                              2                              2                               2                               0

回答by piRSquared

DOCUMENTATION

文件

There are 2 things going on that control for the formatting you may see.

对于您可能会看到的格式的控制,有两件事正在发生。

  1. Controlling for the the character width that the display can handle.

    • This is handled with the pandas option display.widthand can be seen with print pd.get_option('display.width'). The default is 80.
  2. The second control is the number of columns in the dataframe to display.

    • This is handled with the pandas option display.max_columnsand can be seen with print pd.get_option('display.max_columns'). The default is 20.
  1. 控制显示器可以处理的字符宽度。

    • 这是用 pandas 选项处理的display.width,可以用print pd.get_option('display.width'). 默认为80
  2. 第二个控件是数据框中要显示的列数。

    • 这是用 pandas 选项处理的display.max_columns,可以用print pd.get_option('display.max_columns'). 默认为20

display.width

display.width

Let's explore what this does with a sample dataframe

让我们用一个示例数据框来探索它的作用

import pandas as pd

df = pd.DataFrame([range(40)], columns=['ABCDE%d' % i for i in range(40)])

print df # this is with default 'display.width' of 80

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  \
0       0       1       2       3       4       5       6       7       8   

   ABCDE9   ...     ABCDE30  ABCDE31  ABCDE32  ABCDE33  ABCDE34  ABCDE35  \
0       9   ...          30       31       32       33       34       35   

   ABCDE36  ABCDE37  ABCDE38  ABCDE39  
0       36       37       38       39  

[1 rows x 40 columns]

pd.set_option('display.width', 40)

pd.set_option('display.width', 40)

print df

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  \
0       0       1       2       3   

   ABCDE4  ABCDE5  ABCDE6  ABCDE7  \
0       4       5       6       7   

   ABCDE8  ABCDE9   ...     ABCDE30  \
0       8       9   ...          30   

   ABCDE31  ABCDE32  ABCDE33  ABCDE34  \
0       31       32       33       34   

   ABCDE35  ABCDE36  ABCDE37  ABCDE38  \
0       35       36       37       38   

   ABCDE39  
0       39  

[1 rows x 40 columns]

pd.set_option('display.width', 120)

pd.set_option('display.width', 120)

This should scroll to the right.

这应该向右滚动。

print df

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  ABCDE9   ...     ABCDE30  ABCDE31  ABCDE32  \
0       0       1       2       3       4       5       6       7       8       9   ...          30       31       32   

   ABCDE33  ABCDE34  ABCDE35  ABCDE36  ABCDE37  ABCDE38  ABCDE39  
0       33       34       35       36       37       38       39  

[1 rows x 40 columns]

display.max_columns

display.max_columns

Let's put 'display.width'back to 80 with pd.set_option('display.width,80)

让我们'display.width'回到 80pd.set_option('display.width,80)

Now let's explore different values of 'display.max_columns'

现在让我们探索不同的价值观 'display.max_columns'

print df # default 20

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  \
0       0       1       2       3       4       5       6       7       8   

   ABCDE9   ...     ABCDE30  ABCDE31  ABCDE32  ABCDE33  ABCDE34  ABCDE35  \
0       9   ...          30       31       32       33       34       35   

   ABCDE36  ABCDE37  ABCDE38  ABCDE39  
0       36       37       38       39  

[1 rows x 40 columns]

Notice the ellipses in the middle. There are 40 columns in this data frame, to get to a display count of 20 max columns, pandas took the first 10 columns 0:9and the last 10 columns 30:39and put an ellipses in the middle.

注意中间的椭圆。这个数据框中有 40 列,为了达到最大 20 列的显示计数,pandas 取前 10 列0:9和最后 10 列,30:39并在中间放置一个省略号。

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

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

print df

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  \
0       0       1       2       3       4       5       6       7       8   

   ABCDE9  ABCDE10  ABCDE11  ABCDE12  ABCDE13  ABCDE14   ...     ABCDE25  \
0       9       10       11       12       13       14   ...          25   

   ABCDE26  ABCDE27  ABCDE28  ABCDE29  ABCDE30  ABCDE31  ABCDE32  ABCDE33  \
0       26       27       28       29       30       31       32       33   

   ABCDE34  ABCDE35  ABCDE36  ABCDE37  ABCDE38  ABCDE39  
0       34       35       36       37       38       39  

[1 rows x 40 columns]

Notice the width of characters stayed the same but I have more columns. pandas took the first 15 columns 0:14and the last 15 columns 26:39.

注意字符的宽度保持不变,但我有更多的列。pandas 取前 15 列0:14和后 15 列26:39

To get all of your columns displayed, you need to set this option to be at least as big as the number of columns you want displayed.

要显示所有列,您需要将此选项设置为至少与要显示的列数一样大。

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

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

print df

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  \
0       0       1       2       3       4       5       6       7       8   

   ABCDE9  ABCDE10  ABCDE11  ABCDE12  ABCDE13  ABCDE14  ABCDE15  ABCDE16  \
0       9       10       11       12       13       14       15       16   

   ABCDE17  ABCDE18  ABCDE19  ABCDE20  ABCDE21  ABCDE22  ABCDE23  ABCDE24  \
0       17       18       19       20       21       22       23       24   

   ABCDE25  ABCDE26  ABCDE27  ABCDE28  ABCDE29  ABCDE30  ABCDE31  ABCDE32  \
0       25       26       27       28       29       30       31       32   

   ABCDE33  ABCDE34  ABCDE35  ABCDE36  ABCDE37  ABCDE38  ABCDE39  
0       33       34       35       36       37       38       39  

No ellipses, all columns are displayed.

没有省略号,显示所有列。

Combining both options together

将两个选项结合在一起

Pretty simple at this point. pd.set_option('display.width', 1000)use 1000 to allow for something long. pd.set_option('display.max_columns', 1000)also allowing for wide dataframes.

在这一点上很简单。 pd.set_option('display.width', 1000)使用 1000 以允许较长的时间。 pd.set_option('display.max_columns', 1000)还允许宽数据帧。

print df

   ABCDE0  ABCDE1  ABCDE2  ABCDE3  ABCDE4  ABCDE5  ABCDE6  ABCDE7  ABCDE8  ABCDE9  ABCDE10  ABCDE11  ABCDE12  ABCDE13  ABCDE14  ABCDE15  ABCDE16  ABCDE17  ABCDE18  ABCDE19  ABCDE20  ABCDE21  ABCDE22  ABCDE23  ABCDE24  ABCDE25  ABCDE26  ABCDE27  ABCDE28  ABCDE29  ABCDE30  ABCDE31  ABCDE32  ABCDE33  ABCDE34  ABCDE35  ABCDE36  ABCDE37  ABCDE38  ABCDE39
0       0       1       2       3       4       5       6       7       8       9       10       11       12       13       14       15       16       17       18       19       20       21       22       23       24       25       26       27       28       29       30       31       32       33       34       35       36       37       38       39

Using your data

使用您的数据

print df

   TFs    No  Esenciales  Genes  regulados  Genes.1  Regulados  Positivamente  Genes.2  Regulados.1  Negativamente  No.1  Tentativo  de  genes   a  silenciar  No.2  Real  de.1  genes.1  a.1  silenciar.1  No.3  Tentativo.1  de.2  genes.2  a.2  inducir
0  146  YdeO          20     18          2        2          2              0      NaN          NaN            NaN   NaN        NaN NaN    NaN NaN        NaN   NaN   NaN   NaN      NaN  NaN          NaN   NaN          NaN   NaN      NaN  NaN      NaN

BIG CAVEAT

大警告

When you run this, you may not see this scrolling magic that you do here. This is because your terminal probably doesn't scroll to the right. Below is a screen shot from jupyter-notebook. It doesn't look right because the text is being wrapped. However, there are no new lines in the string where it wraps as evidenced by the fact that when I copied and pasted it to stack overflow, it displays appropriately.

当你运行它时,你可能看不到你在这里做的滚动魔法。这是因为您的终端可能不会向右滚动。下面是 jupyter-notebook 的屏幕截图。它看起来不正确,因为文本正在被换行。但是,字符串中没有换行的新行,事实证明,当我将其复制并粘贴到堆栈溢出时,它会正确显示。

enter image description here?

在此处输入图片说明?

回答by chrisb

There are display optionsthat can be used to control how the DataFramewill be printed. You probably want:

有一些显示选项可用于控制DataFrame将如何打印。你可能想要:

In [28]: pd.set_option('expand_frame_repr', False)

In [29]: pd.set_option('display.max_columns', 999)