在Python Pandas DataFrame或Jupyter笔记本中包装列名

时间:2017-03-29 11:34:55

标签: python pandas dataframe formatting jupyter-notebook

我的数据框中有一些列的长标题,我希望能够包装文本。我知道这个功能内置于大熊猫中,就像我一样:

pd.DataFrame(np.random.randn(2, 10), 
    columns=['Very Long Column Title ' + str(i) for i in range(10)])

DataFrame with wrapped column names

但如果我的列数较少,则标题不会换行:

pd.DataFrame(np.random.randn(10, 2), 
    columns=['Very Long Column Title ' + str(i) for i in range(2)])

DataFrame does not wrap column names

我还尝试手动插入换行符:

import pandas as pd    
pd.DataFrame(np.random.randn(10, 2), 
    columns=['Very Long \n Column Title ' + str(i) for i in range(2)])

但是它提供了与上面相同的输出。

我发现有关此主题的答案类似:

我在Jupyter笔记本电脑上工作,但如果可能的话,我更喜欢基于熊猫的解决方案。

4 个答案:

答案 0 :(得分:6)

Jupyter笔记本从许多来源继承了它们的显示属性。 pandas中没有限制列标题宽度的属性,因为pandas不是导致文本换行的原因,它实际上是呈现的HTML。

您可以使用以下方式覆盖默认的Jupyter Notebook样式以限制表格标题的最大宽度:

from IPython.core.display import HTML
HTML("<style>.rendered_html th {max-width: 120px;}</style>")

在笔记本顶部运行此代码一次,将html表标题的最大列宽设置为120像素。

答案 1 :(得分:4)

以下是不涉及更改IPython属性的答案:

df = pd.DataFrame(np.random.randn(10, 2), 
    columns=['Very Long Column Title ' + str(i) for i in range(2)])
df.style.set_table_styles([dict(selector="th",props=[('max-width', '50px')])])

答案 2 :(得分:1)

或者,您可以使用软件包textwrap

import textwrap

cols = ['Very Long Column Title ' + str(i) for i in range(2)]

# Split wide columns, you can then join these with any delimiter you'd like
cols = [textwrap.wrap(x, width=20) for x in cols]

# print(cols)
# [['Very Long Column', 'Title 0'], ['Very Long Column', 'Title 1']]

答案 3 :(得分:0)

你可以&#34;入侵&#34;通过以下方式将空格插入列标题中的正确行为:

def colfix(df, L=5): return df.rename(columns=lambda x: ' '.join(x.replace('_', ' ')[i:i+L] for i in range(0,len(x),L)) if df[x].dtype in ['float64','int64'] else x )

colfix(your_df)

查看我对类似问题的回答https://stackoverflow.com/a/45078833/6903458