我pd.set_option("display.colheader_justify","right")用来设置列标题。但我找不到数据的选项pd.describe_option()。
如何设置数据框中的数据显示每列的左对齐或右对齐?或者,是否可以为整行数据显示定义格式模板?
如果要更改 Jupyter Notebook 中的显示,可以使用样式功能。
# Test data
df = DataFrame({'text': ['foo', 'bar'],
                 'number': [1, 2]})
df.style.set_properties(**{'text-align': 'right'})
    @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')])])
将对齐所有表格文本和列标题。
我不需要以相同的方式证明所有列的合理性,而是需要以不同的方式证明某些列的合理性。由于该线程中没有提及,我想提醒该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'})
    例如,如果您想将文本和标题都向左对齐,您可以使用:
df.style.set_properties(**{'text-align': 'left'}).set_table_styles([ dict(selector='th', props=[('text-align', 'left')] ) ])
这首先将文本设置到左侧,然后设置标题。
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 数据框列数据向左对齐。删除熊猫数据框中索引的显示。将----放在标题和列数据之间。
我将@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()或其他一些限制一起使用。)
在我的情况下,我的 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)
    你可以通过一个新的上下文来控制它:
with pd.option_context('display.colheader_justify','right'):
    ...
    由于使用的解决方案在控制台打印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