49

pd.set_option("display.colheader_justify","right")用来设置列标题。但我找不到数据的选项pd.describe_option()

如何设置数据框中的数据显示每列的左对齐或右对齐?或者,是否可以为整行数据显示定义格式模板?

4

9 回答 9

23

如果要更改 Jupyter Notebook 中的显示,可以使用样式功能。

# Test data
df = DataFrame({'text': ['foo', 'bar'],
                 'number': [1, 2]})

df.style.set_properties(**{'text-align': 'right'})

在此处输入图像描述

于 2016-09-11T08:02:24.253 回答
18

@Romain给出的答案很好,但我想总结一些评论:

# Test data
df = DataFrame({'text': ['foo', 'bar'],'number': [1, 2]})

dfStyler = df.style.set_properties(**{'text-align': 'left'})
dfStyler.set_table_styles([dict(selector='th', props=[('text-align', 'left')])])

将对齐所有表格文本列标题。

于 2019-07-11T10:12:00.597 回答
4

我不需要以相同的方式证明所有列的合理性,而是需要以不同的方式证明某些列的合理性。由于该线程中没有提及,我想提醒subset选项的存在:

Styler.set_properties(subset=None, **kwargs)[source]

从与 OP 相同的示例中,可以仅左对齐“文本”列:

df = pd.DataFrame({'text': ['foo', 'bar'],
             'number': [1, 2]})
dfStyler = df.style.set_properties(subset=['text'],**{'text-align': 'left'})
于 2021-02-19T02:57:10.340 回答
3

例如,如果您想将文本和标题都向左对齐,您可以使用:

df.style.set_properties(**{'text-align': 'left'}).set_table_styles([ dict(selector='th', props=[('text-align', 'left')] ) ])

这首先将文本设置到左侧,然后设置标题。

于 2019-12-13T12:35:29.350 回答
3
pip3 install tabulate

from tabulate import tabulate
df = pd.DataFrame ({'Text': ['abcdef', 'x'], 'Value': [12.34, 4.2]})
print(tabulate(df, showindex=False, headers=df.columns))

Text      Value
------  -------
abcdef    12.34
x          4.2

这将自动将 pandas 标题和列数据对齐到良好的视图格式。自动将 pandas 数据框列数据向左对齐。删除熊猫数据框中索引的显示。将----放在标题和列数据之间。

于 2020-12-23T09:33:38.550 回答
2

我将@Hagbard的答案包装在一个函数中,以便在我希望在笔记本单元格上显示包含英文文本的 pandas 数据框时使用它:

from pandas import DataFrame


def left_align(df: DataFrame):
    left_aligned_df = df.style.set_properties(**{'text-align': 'left'})
    left_aligned_df = left_aligned_df.set_table_styles(
        [dict(selector='th', props=[('text-align', 'left')])]
    )
    return left_aligned_df

为了显示一个数据框,我简单地写了这个:

left_align(df.head())

在此处输入图像描述

注意:对于大型数据集,它会在df 没有任何抽象的情况下打印 的所有行和列,因此 Jupyter 崩溃!这就是为什么我将它与.head()or.tail()或其他一些限制一起使用。)

于 2020-09-13T10:47:21.703 回答
1

在我的情况下,我的 Pandas DataFrame 有一个类包装器。__str__()这允许我通过自定义包装器的方法来左对齐 DataFrame 的字符串输出。

以下是我根据Unutbu 对类似问题的回答的应用程序解决问题的方法。Pandas DataFrame 被引用self.data

def __str__(self):
    """
    Return the test stats report as a single string
    with left-justified columns.

    """
    # Columns containing boolean values need different format strings
    # to avoid 'ValueError: Invalid format specifier' exceptions.
    BOOL_COLUMNS = ['success',]

    formatters = {}
    for li in list(self.data.columns):
        if li in BOOL_COLUMNS:
            form = "{{!s:<5}}".format()
        else:
            max = self.data[li].str.len().max()
            form = "{{:<{}s}}".format(max)

        formatters[li] = functools.partial(str.format,form)

    return self.data.to_string(formatters=formatters, index=False)
于 2017-08-18T19:24:45.400 回答
1

你可以通过一个新的上下文来控制它:

with pd.option_context('display.colheader_justify','right'):
    ...
于 2017-07-13T06:03:06.123 回答
1

由于使用的解决方案在控制台打印pandas.Styler中不起作用(至少对我而言),我使用pandas 1.3.3和示例数据框提出了以下代码,打印所有字符串列左对齐(无标题):

    df = pd.DataFrame({'float': [0.123, 7],
                       'int': [3, 357676],
                       'str': ["hello world", "bye"],
                       'cat': pd.Series(["a", "bbb"], dtype="category"),
                       'bool': [True, False]
                       })

    formatters = {}
    for col in df.select_dtypes("object"):
        len_max = df[col].str.len().max()
        formatters[col] = lambda _: f"{_:<{len_max}s}"

    print(df.to_string(formatters=formatters))
       float     int          str  cat   bool
    0  0.123       3  hello world    a   True
    1  7.000  357676  bye          bbb  False

如果您还想将标题左对齐,请添加justify='left'. 出于某种原因,对于某些列,标题现在是一个字符太远了,但不是全部:

    print(df.to_string(formatters=formatters, justify="left"))
       float  int    str          cat   bool 
    0  0.123       3  hello world    a   True
    1  7.000  357676  bye          bbb  False

但是,将此模式应用于其他 dtype 失败(也适用于字符串列)。我不知道为什么会这样。请注意,字符串转换是通过下面添加astype的,也在 f 字符串内:

    formatters = {}
    for col in df.columns:
        len_max = df[col].astype(str).str.len().max()
        formatters[col] = lambda _: f"{_!s:<{len_max}s}"
        print(col, len_max)

    print(df.to_string(formatters=formatters))
      float    int          str    cat   bool
    0 0.123  3      hello world  a      True 
    1 7.0   357676        bye    bbb    False
于 2021-10-27T10:35:24.630 回答