如何设置pandas数据框数据的左/右对齐?

54 人关注

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

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

4 个评论
我认为这不存在,默认情况下,数据是根据标题的位置右对齐的,据我所知,只存在格式化标题的选项,而不是数据。
你是想在笔记本中实现这个目标,还是在一般情况下?
我想这是不存在的(我知道一些用于透视和Pandas Pretty Tables模块的格式化东西),但AFAIK这些不会做你想要的事情。如果你只需要打印数据,你可以使用 to_string(justify-'left') 。- 但这将适用于所有列。另外,似乎只有当你的列名足够大,足以实际迫使该列中的条目被对齐时,这才会起作用。如果列名小而条目大,它就不会有任何对齐的效果。
smci
这些答案中的大部分都不能在控制台中使用,对于字符串来说,显然只能在Jupyter Notebook中使用(从pandas 0.25开始),或者对于数字字段。请务必说明是哪一种。
python
pandas
bigbug
bigbug
发布于 2013-06-21
9 个回答
Romain
Romain
发布于 2017-08-19
已采纳
0 人赞同

如果你想改变Jupyter笔记本的显示,你可以使用 Style 功能。

# Test data
df = DataFrame({'text': ['foo', 'bar'],
                 'number': [1, 2]})
df.style.set_properties(**{'text-align': 'right'})
    
Alex
不幸的是,这对字符串不起作用,通过对上述例子进行 df.style.set_properties(**{'text-align': 'left'}) 并检查文本数据列可以看出(它将保持右对齐)。
替换代码0】现在似乎对我有用了,谢谢 - Pandas 0.22.0, Jupyter 4.4.0, Chrome 70.
如果你想对单个数据框架的列标题进行对齐,你可以通过 df.style.set_table_styles([ dict(selector='th', props=[('text-align', 'left')] ) ]) 来实现。
要应用于一个列的子集,你可以使用子集参数。 .set_properties(subset=["col1", "col2"], **{'text-align': 'right'})
Hagbard
Hagbard
发布于 2017-08-19
0 人赞同

的答案。 @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')])])

将对齐所有的表格文本列的标题也是如此。

文字只向左对齐,直到2048年,然后一切都恢复到右边。
Shah Vipul
Shah Vipul
发布于 2017-08-19
0 人赞同
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数据框架的列数据向左对齐。 移除pandas数据框架中的索引显示。 在页眉和列数据之间放置----。

Heelara
Heelara
发布于 2017-08-19
0 人赞同

我需要以不同的方式证明一些列的合理性,而不是以同样的方式证明所有的列。因为在这个主题中没有提到,所以我想提醒一下存在的 the subset option :

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'})
    
Federico Gentile
Federico Gentile
发布于 2017-08-19
0 人赞同

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

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

这首先将文本设置在左边,然后是标题。

smci
这在控制台中不起作用(从pandas 0.25开始)。可能只在Jupyter上。
ascripter
ascripter
发布于 2017-08-19
0 人赞同

Since solutions using pandas.Styler don't work in console printing (至少对我来说是这样),我想出了以下代码,使用 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'。由于某些原因,现在的页眉向左偏移了一个字符。some列,但不是所有的。

    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

然而,将这种模式应用到其他dtypes上却失败了(对于字符串列也是如此)。我不知道为什么会出现这种情况。请注意,下面通过astype添加了字符串转换,也在f-string里面。

    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
    
mozlingyu
mozlingyu
发布于 2017-08-19
0 人赞同

你可以通过一个新的环境来控制它。

with pd.option_context('display.colheader_justify','right'):
    
你将如何实际应用于打印出数据框架?(在Jupyter中)
看起来,不支持将标题居中对齐,这很遗憾。
是否有任何选项可以证明细胞的合理性?
smci
不,这只是列标题的左对齐,而不是列本身。
Shahrokh Bah
Shahrokh Bah
发布于 2017-08-19
0 人赞同

我包了 @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().tail()或其他一些限制来使用它)。

JS.
JS.
发布于 2017-08-19
0 人赞同

在我的情况下,我有一个围绕我的Pandas DataFrame的类包装器。 这使得我可以通过定制包装器的 __str__() 方法来对DataFrame的字符串输出进行左对齐。

下面是我如何解决我的应用问题的,基于 乌努特布的回答 到一个 类似问题 . 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)