为什么熊猫不能正确地用长MultiIndex级别名称打印我的DataFrame?

时间:2019-05-09 20:31:07

标签: pandas terminal pretty-print

pandas具有很多魔术,可以根据终端窗口的大小漂亮地打印DataFrame。不幸的是,我的校准似乎略有错误,因此我通常必须将端子宽度扩大1-2个字符才能使其适应要求。好像是一直在低估MultiIndex的宽度,还是在高估终端窗口的宽度。

据我所知,问题发生在以下时间:

  • 列太多,无法一次显示在屏幕上,并且

  • 索引是一个MultiIndex,其中包含多个具有长名称的级别。

这是一个示例脚本:

import pandas
import numpy as np

df = pandas.DataFrame(np.zeros((9, 16), dtype=np.int))
df.index = pandas.MultiIndex.from_product([
    ['awefawef', 'asdaoijo', 'awefoiasdfasji'], 
    ['awefawef', 'asdoaijo', 'awefoiji', ], 
    ])

print(df)

结果很难看: enter image description here

如果我稍微增加宽度,那很好。这就是我想要的:列的子集,选择不超过可用宽度。 enter image description here

但是当我继续工作时,我必须每隔几分钟将终端宽度增加1-2个字符,这令人沮丧。因此,它检测到我正在增加端子宽度,但是它仍然倾向于使输出略宽。

我目前已设置了这些选项。从文档上看,这些对我来说都是正确的。

In [4]: pandas.get_option('display.width')
Out[4]: 80

In [5]: pandas.get_option('display.expand_frame_repr')
Out[5]: True

In [12]: pandas.get_option('display.pprint_nest_depth')
Out[12]: 3

任何提示?

1 个答案:

答案 0 :(得分:0)

我有一种解决方法,但我希望有人能提供更好的答案。

如果我设置了

pandas.set_option('display.max_columns', 12)
pandas.set_option('display.width', None)

然后正确格式化输出的端子宽度。

                         0   1   2   3   4   5   ...  10  11  \
awefawef       awefawef   0   0   0   0   0   0  ...   0   0   
               asdoaijo   0   0   0   0   0   0  ...   0   0   
               awefoiji   0   0   0   0   0   0  ...   0   0   
asdaoijo       awefawef   0   0   0   0   0   0  ...   0   0   
               asdoaijo   0   0   0   0   0   0  ...   0   0   
               awefoiji   0   0   0   0   0   0  ...   0   0   
awefoiasdfasji awefawef   0   0   0   0   0   0  ...   0   0   
               asdoaijo   0   0   0   0   0   0  ...   0   0   
               awefoiji   0   0   0   0   0   0  ...   0   0   

                         12  13  14  15  
awefawef       awefawef   0   0   0   0  
               asdoaijo   0   0   0   0  
               awefoiji   0   0   0   0  
asdaoijo       awefawef   0   0   0   0  
               asdoaijo   0   0   0   0  
               awefoiji   0   0   0   0  
awefoiasdfasji awefawef   0   0   0   0  
               asdoaijo   0   0   0   0  
               awefoiji   0   0   0   0  

[9 rows x 16 columns]

有两个缺点:

  • 我宁愿根据每列的宽度选择列数,而不是硬编码为12。
  • 这将输出溢出到多个“框架”,必要时达到12列。我希望它被一个“ ...”截断以适合所有框架。

尽管如此,这种解决方法至少可以产生清晰的结果。如果有人可以发布更完整的答案,我会接受。