首页 > 解决方案 > 为什么 pandas 不能正确打印带有长 MultiIndex 级别名称的 DataFrame?

问题描述

pandas 有很多魔力,可以根据终端窗口的大小漂亮地打印 DataFrame。不幸的是,我的似乎有点校准错误,因此我经常不得不将终端宽度扩大 1-2 个字符以使其适合。就好像它一直低估 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)

结果很丑: 在此处输入图像描述

如果我只是稍微增加宽度,就可以了。这就是我想要的:列的一个子集,选择不超过可用宽度。 在此处输入图像描述

但随着我继续工作,我必须每隔几分钟将终端宽度增加 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

有小费吗??

标签: pandasterminalpretty-print

解决方案


我有一个解决方法,但我希望有人会发布更好的答案。

如果我设置:

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 列。我宁愿用“...”将其截断以适合所有内容。

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


推荐阅读