如何自定义DataFrame显示的标题和列宽?

kjo*_*kjo 7 pandas

作为一项规则,我喜欢使用长的描述性列名(例如,estimated_background_signal而不仅仅是bg)用于DataFrame对象.这种偏好的一个缺点是,DataFrame显示形式有几列比它们的值要宽得多.例如:

In [10]: data.head()
     barcode estimated_background_signal inhibitor_code inhibitor_concentration
0  R00577279                         133            IRB                   0.001
1  R00577279                         189            SNZ                   0.001
2  R00577279                         101            CMY                   0.001
3  R00577279                         112            BRC                   0.001
4  R00577279                         244            ISB                   0.001
Run Code Online (Sandbox Code Playgroud)

如果显示器更窄则会很好.无视标题,最窄的显示将是:

0 R00577279 113 IRB 0.001
1 R00577279 189 SNZ 0.001
2 R00577279 101 CMY 0.001
3 R00577279 112 BRC 0.001
4 R00577279 244 ISB 0.001
Run Code Online (Sandbox Code Playgroud)

......但完全取消标题并不是一个完全令人满意的解决方案.一个更好的方法是使显示宽度足以允许一些标题,可能占用几行:

    barcode estim inhib inhib
            ated_ itor_ itor_
            backg code  conce
0 R00577279   113   IRB 0.001
1 R00577279   189   SNZ 0.001
2 R00577279   101   CMY 0.001
3 R00577279   112   BRC 0.001
4 R00577279   244   ISB 0.001
Run Code Online (Sandbox Code Playgroud)

很明显,没有任何一种约定适合所有情况,但是,无论如何,它是否pandas提供了自定义DataFrame显示形式的标题和列宽的方法?

Joh*_*hnE 1

这是一个以非标准方式使用 pandas 的多索引功能的黑客行为,尽管我没有看到这样做有任何重大问题。当然,使用多索引而不是简单索引会增加一些复杂性。

cols = df.columns
lencols = [ int(len(c)/2) for c in cols ]

df.columns = pd.MultiIndex.from_tuples( 
                 tuple( ( c[:ln], c[ln:] ) for c, ln in zip(cols, lencols) ) )
Run Code Online (Sandbox Code Playgroud)

结果:

         bar  estimated_bac inhibit  inhibitor_c
        code kground_signal or_code oncentration
0  R00577279            133     IRB        0.001
1  R00577279            189     SNZ        0.001
2  R00577279            101     CMY        0.001
3  R00577279            112     BRC        0.001
4  R00577279            244     ISB        0.001
Run Code Online (Sandbox Code Playgroud)

您还可以考虑创建一个字典来根据需要在长名称和短名称之间进行转换: