Python 将 Pandas 数据框导出为表格图像

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26678467/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 00:51:34  来源:igfitidea点击:

Export a Pandas dataframe as a table image

pythonpandas

提问by user2370852

Is it possible to export a Pandas dataframe as an image file? Something like df.to_png()or df.to_table().savefig('table.png').

是否可以将 Pandas 数据框导出为图像文件?像df.to_png()或 之类的东西df.to_table().savefig('table.png')

At the moment I export a dataframe using df.to_csv(). I then open this csv file in Excel to make the data look pretty and then copy / paste the Excel table into Powerpoint as an image. I see matplotlib has a .table()method, but I'm having trouble getting it to work with my df.

目前我使用df.to_csv(). 然后我在 Excel 中打开这个 csv 文件使数据看起来很漂亮,然后将 Excel 表格复制/粘贴到 Powerpoint 中作为图像。我看到 matplotlib 有一个.table()方法,但我无法让它与我的 df 一起工作。

The data frame I'm using has 5 columns and 5 rows and each 'cell' is a number.

我使用的数据框有 5 列和 5 行,每个“单元格”都是一个数字。

回答by unutbu

If you have pdflatex and imagemagick installed, you could export the DataFrame to tex, use pdflatex to convert it to a pdf file, and then convert the pdf to png using imagemagick:

如果您安装了 pdflatex 和 imagemagick,则可以将 DataFrame 导出为 tex,使用 pdflatex 将其转换为 pdf 文件,然后使用 imagemagick 将 pdf 转换为 png:

import pandas as pd
import numpy as np
import subprocess

df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.],
                   'c': np.tile(['a', 'b', 'c'], 2),
                   'v': np.arange(1., 7.)})
filename = 'out.tex'
pdffile = 'out.pdf'
outname = 'out.png'

template = r'''\documentclass[preview]{{standalone}}
\usepackage{{booktabs}}
\begin{{document}}
{}
\end{{document}}
'''

with open(filename, 'wb') as f:
    f.write(template.format(df.to_latex()))

subprocess.call(['pdflatex', filename])
subprocess.call(['convert', '-density', '300', pdffile, '-quality', '90', outname])

enter image description here

在此处输入图片说明

If you install phantomjsand imagemagick, you could export the DataFrame to HTML and then use phantomjs to convert the HTML to png, and imagemagick to crop the result:

如果你安装了phantomjs和 imagemagick,你可以将 DataFrame 导出为 HTML,然后使用 phantomjs 将 HTML 转换为 png,并使用 imagemagick 来裁剪结果:

import pandas as pd
import numpy as np
import subprocess

df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.],
                   'c': np.tile(['a', 'b', 'c'], 2),
                   'v': np.arange(1., 7.)})
filename = '/tmp/out.html'
outname = '/tmp/out.png'
cropname = '/tmp/cropped.png'

with open(filename, 'wb') as f:
    f.write(df.to_html())
rasterize = '/path/to/phantomjs/examples/rasterize.js'
subprocess.call(['phantomjs', rasterize, filename, outname])
subprocess.call(['convert', outname, '-trim', cropname])

enter image description here

在此处输入图片说明

回答by volodymyr

With some additional code, you can even make output look decent:

使用一些额外的代码,您甚至可以使输出看起来不错:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import six

df = pd.DataFrame()
df['date'] = ['2016-04-01', '2016-04-02', '2016-04-03']
df['calories'] = [2200, 2100, 1500]
df['sleep hours'] = [2200, 2100, 1500]
df['gym'] = [True, False, False]


def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14,
                     header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='w',
                     bbox=[0, 0, 1, 1], header_columns=0,
                     ax=None, **kwargs):
    if ax is None:
        size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height])
        fig, ax = plt.subplots(figsize=size)
        ax.axis('off')

    mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=data.columns, **kwargs)

    mpl_table.auto_set_font_size(False)
    mpl_table.set_fontsize(font_size)

    for k, cell in  six.iteritems(mpl_table._cells):
        cell.set_edgecolor(edge_color)
        if k[0] == 0 or k[1] < header_columns:
            cell.set_text_props(weight='bold', color='w')
            cell.set_facecolor(header_color)
        else:
            cell.set_facecolor(row_colors[k[0]%len(row_colors) ])
    return ax

render_mpl_table(df, header_columns=0, col_width=2.0)

enter image description here

在此处输入图片说明