【问题标题】:How to set the pandas dataframe data left/right alignment?如何设置熊猫数据框数据左/右对齐?
【发布时间】:2013-06-18 09:27:54
【问题描述】:

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

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

【问题讨论】:

  • 我认为这不存在,默认情况下,数据根据标题位置右对齐,据我所知,仅存在格式化标题而不是数据的选项
  • 您是希望在笔记本中实现这一目标还是在一般情况下实现这一目标?
  • 我认为这不存在(我知道一些用于枢轴和 Pandas Pretty Tables 模块的格式化内容),但是 AFAIK 这些不会满足您的要求。如果您只需要打印数据,则可以使用to_string(justify-'left') - 但这会将其应用于所有列。似乎只有当您的列名足够大以实际强制列中的条目是合理的时,这才有效。如果列名小而条目大,则没有任何对齐效果。
  • 这些答案中的大多数不适用于控制台、字符串,显然仅适用于 Jupyter Notebook(截至 pandas 0.25)或数字字段。请务必说明是哪个。

标签: python pandas


【解决方案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'。出于某种原因,标题现在对于 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

但是,将此模式应用于其他 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

【讨论】:

    【解决方案2】:

    我需要以不同的方式对某些列进行对齐,而不是以相同的方式对齐所有列。由于本帖没有提及,所以想提醒一下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'})
    

    【讨论】:

      【解决方案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 数据框列数据向左对齐。 删除熊猫数据框中索引的显示。 将----放在标题和列数据之间。

      【讨论】:

        【解决方案4】:

        我将 @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() 或其他一些限制一起使用。)

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 这在控制台上不起作用(从 pandas 0.25 开始)。可能只在 Jupyter 上。
          【解决方案6】:

          @Romain给出的答案很好但是我想总结一些cmets:

          # 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 年,然后一切都恢复到右侧
          【解决方案7】:

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

          以下是我根据Unutbu's answersimilar question 为我的应用程序解决问题的方法。 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)
          

          【讨论】:

            【解决方案8】:

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

            with pd.option_context('display.colheader_justify','right'):
                ...
            

            【讨论】:

            • 你将如何实际应用它来打印数据框? (在 Jupyter 中)
            • 好像不支持居中对齐的标题,可惜了
            • 有没有对齐单元格的选项?
            • 不,这只会左对齐列标题,而不是列本身。
            【解决方案9】:

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

            # Test data
            df = DataFrame({'text': ['foo', 'bar'],
                             'number': [1, 2]})
            
            df.style.set_properties(**{'text-align': 'right'})
            

            【讨论】:

            • 不幸的是,这不适用于字符串,正如在上面的示例中执行df.style.set_properties(**{'text-align': 'left'}) 并检查文本数据列(它将保持右对齐)
            • {'text-align': 'left'} 现在似乎对我有用,谢谢 - 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'})
            猜你喜欢
            • 2018-09-07
            • 2020-03-12
            • 2023-03-13
            • 2021-08-16
            • 2013-08-14
            • 2023-03-11
            • 2016-01-28
            • 2020-11-20
            • 2018-09-19
            相关资源
            最近更新 更多