漂亮打印熊猫数据框架

我如何打印一个熊猫数据框架作为一个漂亮的基于文本的表,就像下面?

+------------+---------+-------------+
| column_one | col_two |   column_3  |
+------------+---------+-------------+
|          0 |  0.0001 | ABCD        |
|          1 |  1e-005 | ABCD        |
|          2 |  1e-006 | long string |
|          3 |  1e-007 | ABCD        |
+------------+---------+-------------+
302949 次浏览

你可以使用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

我用了奥弗的答案一段时间,发现它在大多数情况下都很棒。不幸的是,由于熊猫的to_csvprettytable的from_csv之间的不一致,我不得不以不同的方式使用preytable。

一个失败的例子是包含逗号的数据帧:

pd.DataFrame({'A': [1, 2], 'B': ['a,', 'b']})

Prettytable引发了一个形式错误:

Error: Could not determine delimiter

下面的函数处理这种情况:

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

如果你不关心索引,使用:

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

我刚刚找到了一个很好的工具来满足这个需求,它被称为汇总

它打印表格数据,并使用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        |
+----+-----------+-------------+

注意:

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

一个简单的方法是输出为html, 熊猫会跳出盒子:

df.to_html('temp.html')

如果您使用的是Jupyter笔记本,则可以运行以下代码以交互式方式在格式良好的表格中显示数据框架。

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

from IPython.display import display, HTML


display(HTML(df.to_html()))

由于在:在iPython Notebook中显示DataFrame为表处的示例,因此为此代码命名

根据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

熊猫>= 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 |

这是它在github上的样子:

enter image description here

注意,你仍然需要安装tabulate包。

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

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)
Output:
+-------+----+-----+
|    a  |  b |   c |
+-------+----+-----+
|     1 |  2 |   3 |
| 11111 | 22 | 333 |
+-------+----+-----+

一个更好的解决方案是简单地把数据帧的变量名放在单元格的最后一行。它会自动打印出漂亮的格式。

import pandas as pd
import numpy as np


df = pd.DataFrame({'Data1': np.linspace(0,10,11), 'Data2': np.linspace(10,0,11)})
df

我使用丰富的库,它有更好看的表比基于.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)

给你这个表格:

enter image description here

更多定制选项请参阅文档:

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