Python 打印熊猫数据框很漂亮

Python 打印熊猫数据框很漂亮,python,pandas,dataframe,printing,Python,Pandas,Dataframe,Printing,如何将pandas数据框打印为一个漂亮的基于文本的表,如下所示 +------------+---------+-------------+ | column_one | col_two | column_3 | +------------+---------+-------------+ | 0 | 0.0001 | ABCD | | 1 | 1e-005 | ABCD | | 2 | 1e-006

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

+------------+---------+-------------+
| column_one | col_two |   column_3  |
+------------+---------+-------------+
|          0 |  0.0001 | ABCD        |
|          1 |  1e-005 | ABCD        |
|          2 |  1e-006 | long string |
|          3 |  1e-007 | ABCD        |
+------------+---------+-------------+
可以使用将表格呈现为文本。诀窍是将数据帧转换为内存中的csv文件,并让prettytable读取它。代码如下:

from StringIO import StringIO
import prettytable    

output = StringIO()
data_frame.to_csv(output)
output.seek(0)
pt = prettytable.from_csv(output)
print pt

我用了一段时间Ofer的答案,发现在大多数情况下都很好。不幸的是,由于来自_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 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)
如果您不关心索引,请使用:

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

我刚刚找到了一个很好的工具来满足这个需求,它叫做

它打印表格数据并与数据框一起工作

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,它:


如果您在Jupyter笔记本中,可以运行以下代码以交互方式在格式良好的表中显示数据帧

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

from IPython.display import display, HTML

display(HTML(df.to_html()))

这段代码的成功归功于以下示例:

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

将熊猫作为pd导入
矩阵=[(1,23,45),(789,1,23),(45678,90)]
df=pd.DataFrame(矩阵,列=list('abc'))
打印(df.to_string())
#产出:
#a、b、c
#  0    1   23  45
#  1  789    1  23
#  2   45  678  90
pandas>=1.0 如果您想要一个内置函数将数据转储到某个github标记中,那么现在就有了一个。看看:

下面是github上的情况:


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

也许您正在寻找类似的软件包:

def format_for_print(df):    
    table = PrettyTable([''] + list(df.columns))
    for row in df.itertuples():
        table.add_row(row)
    return str(table)
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)
def表格化(df):
如果不存在(df、pd.数据帧):
返回
df_columns=df.columns.tolist()
max_len_in_lst=lambda lst:len(已排序(lst,reverse=True,key=len)[0])
align_center=lambda st,sz:“{0}{1}{0}”。格式(“*(1+(sz len(st))//2),st)[:sz]如果len(st)
输出: +-------+----+-----+ |a | b | c| +-------+----+-----+ | 1 | 2 | 3 | | 11111 | 22 | 333 | +-------+----+-----+
这是什么版本的熊猫?好吧,
prettytable
在很大程度上被认为是废弃品。也很遗憾,因为这是一个很好的包裹(@dmn所以不再维护了?
prettytable
从2013年4月6日起就没有发布过。
tablete
是它的精神前身,并定期发布,最近一次是2019年1月24日。您好,
format\u for\u print()
函数似乎没有打印熊猫数据帧的索引。我使用
df.index.name='index'
设置索引,但这不会打印带有名称的索引列。如果您没有访问最前沿的权限,可以执行
制表([list(row)for row in df.values],headers=list(df.columns))
当您在行索引和列中有层次结构时,去除索引的方法不太有效。请确保执行
打印(制表(df,**kwargs))
而不是简单地
制表(df,**kwargs)
;后者将显示所有新行
\n
…要抑制左索引列,可能还需要添加
showindex=False
,我非常喜欢
pandas
tablate
捆绑为可选依赖项,并允许
df.To_tabular(*args,**kwargs)
我使用
标记
从脚本中发出标记,并将其导入
glow-
()以在终端中呈现标记,效果良好。()@SeanBreckenridge链接已断开或无法从public访问。啊,感谢ping;已移动到另一个文件夹。下面是一个示例,其中有更多参数传递到
制表
到_markdown
实际上支持20多种格式()和许多其他关键字。
数据框。到_string
官方文档: Output: +-------+----+-----+ | a | b | c | +-------+----+-----+ | 1 | 2 | 3 | | 11111 | 22 | 333 | +-------+----+-----+