漂亮打印熊猫数据帧

Ofe*_*fer 79 python printing dataframe pandas

如何将pandas数据框打印为一个漂亮的基于文本的表,如下所示?

+------------+---------+-------------+
| column_one | col_two |   column_3  |
+------------+---------+-------------+
|          0 |  0.0001 | ABCD        |
|          1 |  1e-005 | ABCD        |
|          2 |  1e-006 | long string |
|          3 |  1e-007 | ABCD        |
+------------+---------+-------------+
Run Code Online (Sandbox Code Playgroud)

Rom*_*ain 135

我刚刚找到了一个很好的工具来满足这种需求,它被称为制表.

它打印表格数据并使用DataFrame.

from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
print(tabulate(df, headers='keys', tablefmt='psql'))

+----+-----------+-------------+
|    |   col_two | column_3    |
|----+-----------+-------------|
|  0 |    0.0001 | ABCD        |
|  1 |    1e-05  | ABCD        |
|  2 |    1e-06  | long string |
|  3 |    1e-07  | ABCD        |
+----+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

注意:

要抑制所有类型数据的行索引,请传递showindex="never"showindex=False.

  • 如果你没有访问前沿,你可以做'tabulate([列表(行)在df.values中的行],headers = list(df.columns))`来摆脱索引 (5认同)
  • 要抑制左索引列,可能还需要添加`showindex = False` (4认同)
  • 当行索引和列中有层次结构时,效果不太好。 (2认同)

cs9*_*s95 59

熊猫 >= 1.0

如果你想要一个内置函数将你的数据转储到一些 github markdown 中,你现在有一个。看看to_markdown

df = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=['a', 'a', 'b'])  
print(df.to_markdown()) 

|    |   A |   B |
|:---|----:|----:|
| a  |   1 |   1 |
| a  |   2 |   2 |
| b  |   3 |   3 |
Run Code Online (Sandbox Code Playgroud)

这是github上的样子:

在此处输入图片说明

请注意,您仍然需要tabulate安装该软件包。


Ofe*_*fer 15

您可以使用prettytable将表格呈现为文本.诀窍是将data_frame转换为内存中的csv文件,并且可以读取它.这是代码:

from StringIO import StringIO
import prettytable    

output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt
Run Code Online (Sandbox Code Playgroud)

  • ‘prettytable’在爵士乐队的维护下复活了!欢呼!https://github.com/jazzband/prettytable (4认同)
  • AFAIK,`prettytable`在很大程度上被认为是废弃软件。也很可惜,因为这是一个不错的包装。:( (3认同)

sig*_*int 15

跟进 Mark 的回答,如果您出于某种原因使用 Jupyter,例如您想在控制台上进行一些快速测试,您可以使用该DataFrame.to_string方法,该方法至少从 Pandas 0.12 (2014) 开始有效。

import pandas as pd

matrix = [(1, 23, 45), (789, 1, 23), (45, 678, 90)]
df = pd.DataFrame(matrix, columns=list('abc'))
print(df.to_string())

#  outputs:
#       a    b   c
#  0    1   23  45
#  1  789    1  23
#  2   45  678  90
Run Code Online (Sandbox Code Playgroud)

  • 如果不处理数据,则不需要`.to_string()`方法,`print(df)`做同样的事情 (3认同)
  • @Jakob:确实,毕竟问题是关于漂亮的打印,但是您可以更改显示的列数,可以使用`pd.set_option('display.max_columns', None)`全局更改,也可以使用`pd.option_context(') display.max_columns', None): print(df)` (3认同)

小智 8

也许您正在寻找这样的东西:

def tableize(df):
    if not isinstance(df, pd.DataFrame):
        return
    df_columns = df.columns.tolist() 
    max_len_in_lst = lambda lst: len(sorted(lst, reverse=True, key=len)[0])
    align_center = lambda st, sz: "{0}{1}{0}".format(" "*(1+(sz-len(st))//2), st)[:sz] if len(st) < sz else st
    align_right = lambda st, sz: "{0}{1} ".format(" "*(sz-len(st)-1), st) if len(st) < sz else st
    max_col_len = max_len_in_lst(df_columns)
    max_val_len_for_col = dict([(col, max_len_in_lst(df.iloc[:,idx].astype('str'))) for idx, col in enumerate(df_columns)])
    col_sizes = dict([(col, 2 + max(max_val_len_for_col.get(col, 0), max_col_len)) for col in df_columns])
    build_hline = lambda row: '+'.join(['-' * col_sizes[col] for col in row]).join(['+', '+'])
    build_data = lambda row, align: "|".join([align(str(val), col_sizes[df_columns[idx]]) for idx, val in enumerate(row)]).join(['|', '|'])
    hline = build_hline(df_columns)
    out = [hline, build_data(df_columns, align_center), hline]
    for _, row in df.iterrows():
        out.append(build_data(row.tolist(), align_right))
    out.append(hline)
    return "\n".join(out)


df = pd.DataFrame([[1, 2, 3], [11111, 22, 333]], columns=['a', 'b', 'c'])
print tableize(df)
Run Code Online (Sandbox Code Playgroud)
输出:
+--------+----+----+
| 一个 | 乙| c |
+--------+----+----+
| 1 | 2 | 3 |
| 11111 | 11111 22 | 22 333 | 333
+--------+----+----+


ejr*_*jrb 7

我暂时使用了Ofer的答案,并且在大多数情况下发现它很棒.不幸的是,由于pandas的to_csvprettytable 的from_csv之间不一致,我不得不以不同的方式使用prettytable.

一个失败案例是包含逗号的数据框:

pd.DataFrame({'A': [1, 2], 'B': ['a,', 'b']})
Run Code Online (Sandbox Code Playgroud)

Prettytable引发了一个错误的形式:

Error: Could not determine delimiter
Run Code Online (Sandbox Code Playgroud)

以下函数处理这种情况:

def format_for_print(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)
Run Code Online (Sandbox Code Playgroud)

如果您不关心索引,请使用:

def format_for_print2(df):    
    table = PrettyTable(list(df.columns))
    for row in df.itertuples():
        table.add_row(row[1:])
    return str(table)
Run Code Online (Sandbox Code Playgroud)


Eri*_*ulz 7

一个简单的方法是输出为html,大熊猫开箱即用:

df.to_html('temp.html')
Run Code Online (Sandbox Code Playgroud)


Mar*_*sen 6

如果您使用的是Jupyter笔记本,则可以运行以下代码以格式正确的表格交互式显示数据框。

这个答案建立在上面的to_html('temp.html')答案的基础上,但是不是创建文件而是直接在笔记本中显示格式正确的表:

from IPython.display import display, HTML

display(HTML(df.to_html()))
Run Code Online (Sandbox Code Playgroud)

由于以下示例中的代码而获得了此代码的感谢:在iPython Notebook中将DataFrame显示为表

  • 对我来说,即使只是 `display(df)` 看起来也不错。 (7认同)
  • 比使用表格更好。 (3认同)

Spa*_*tan 6

我为此使用了丰富的.to_markdown(库,它的表格比基于表格的表格更好看)。

import pandas as pd
from rich.console import Console
from rich.table import Table
df = pd.DataFrame({'col_two' : [0.0001, 1e-005 , 1e-006, 1e-007],
                   'column_3' : ['ABCD', 'ABCD', 'long string', 'ABCD']})
console = Console()
table = Table('Title')
table.add_row(df.to_string(float_format=lambda _: '{:.4f}'.format(_)))
console.print(table)
Run Code Online (Sandbox Code Playgroud)

给你这张表:

在此输入图像描述

有关更多自定义选项,请参阅文档:

https://rich.readthedocs.io/en/stable/tables.html