如何将pandas数据框打印为一个漂亮的基于文本的表,如下所示?
+------------+---------+-------------+
| column_one | col_two | column_3 |
+------------+---------+-------------+
| 0 | 0.0001 | ABCD |
| 1 | 1e-005 | ABCD |
| 2 | 1e-006 | long string |
| 3 | 1e-007 | ABCD |
+------------+---------+-------------+
答案 0 :(得分:118)
我刚刚找到了一个很好的工具来满足这种需求,它被称为tabulate。
它打印表格数据并与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
。
答案 1 :(得分:30)
如果您想要一个内置函数将数据转储到某些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上的样子:
请注意,您仍然需要安装tabulate
软件包。
答案 2 :(得分: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
答案 3 :(得分:7)
我在一段时间内使用了Ofer的答案,并且在大多数情况下发现它很棒。不幸的是,由于pandas's to_csv和prettytable来自from_csv之间的不一致,我不得不以不同的方式使用prettytable。
一个失败案例是包含逗号的数据框:
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)
答案 4 :(得分:5)
一种简单的方法是将HTML输出为pandas does out of the box:
df.to_html('temp.html')
答案 5 :(得分:1)
也许您正在寻找这样的东西:
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 | +-------+----+-----+
答案 6 :(得分:0)
如果您使用的是Jupyter笔记本,则可以运行以下代码来以格式正确的表格交互显示数据框。
此答案建立在上面的to_html('temp.html')答案的基础上,但没有创建文件,而是直接在笔记本中显示格式正确的表:
from IPython.display import display, HTML
display(HTML(df.to_html()))
答案 7 :(得分:0)
按照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
答案 8 :(得分:-1)
我想要一个数据框的纸质打印输出,但是我想在同一页面上添加一些结果和注释。 我已经完成了上述工作,但无法获得想要的东西。我最终使用 file.write(df1.to_csv())和file.write(“ ,,, blah ,,,,, blah”)语句可以在页面上显示我的其他内容。 当我打开csv文件时,它直接进入了一个电子表格,该电子表格以正确的速度和格式打印了所有内容。