如何将pandas DataFrame表保存为png

Sha*_*erz 42 python pandas

我构建了一个结果的熊猫数据框.此数据框充当表.有MultiIndexed列,每行代表一个名称,即index=['name1','name2',...]创建DataFrame时.我想显示这个表并将其保存为png(或任何图形格式).目前,我能得到的最接近的是将其转换为html,但我想要一个png.看起来有类似的问题,如如何将Pandas数据帧/系列数据保存为数字?

但是,标记的解决方案将数据帧转换为线图(而不是表格),而另一个解决方案依赖于PySide,我只想因为无法将其安装在Linux上而远离它.我希望这段代码易于移植.我真的希望使用python可以轻松创建表格.所有帮助表示赞赏.

bun*_*nji 44

Pandas允许您使用matplotlib绘制表格(详情请参见此处).通常这会将表格直接绘制到一个图表(带有轴和所有内容)上,这不是您想要的.但是,可以先删除它们:

import matplotlib.pyplot as plt
import pandas as pd
from pandas.table.plotting import table # EDIT: see deprecation warnings below

ax = plt.subplot(111, frame_on=False) # no visible frame
ax.xaxis.set_visible(False)  # hide the x axis
ax.yaxis.set_visible(False)  # hide the y axis

table(ax, df)  # where df is your data frame

plt.savefig('mytable.png')
Run Code Online (Sandbox Code Playgroud)

输出可能不是最漂亮的,但您可以在这里找到table()函数的其他参数.还要感谢这篇文章,了解如何在matplotlib中删除轴.


编辑:

在使用上述方法绘图时,这是一种模拟多索引的方法(当然是非常hacky).如果您有一个名为df的多索引数据框,它看起来像:

first  second
bar    one       1.991802
       two       0.403415
baz    one      -1.024986
       two      -0.522366
foo    one       0.350297
       two      -0.444106
qux    one      -0.472536
       two       0.999393
dtype: float64
Run Code Online (Sandbox Code Playgroud)

首先重置索引,使它们成为普通列

df = df.reset_index() 
df
    first second       0
0   bar    one  1.991802
1   bar    two  0.403415
2   baz    one -1.024986
3   baz    two -0.522366
4   foo    one  0.350297
5   foo    two -0.444106
6   qux    one -0.472536
7   qux    two  0.999393
Run Code Online (Sandbox Code Playgroud)

通过将它们设置为空字符串来删除高阶多索引列中的所有重复项(在我的示例中,我在"first"中只有重复索引):

df.ix[df.duplicated('first') , 'first'] = ''
df
  first second         0
0   bar    one  1.991802
1          two  0.403415
2   baz    one -1.024986
3          two -0.522366
4   foo    one  0.350297
5          two -0.444106
6   qux    one -0.472536
7          two  0.999393
Run Code Online (Sandbox Code Playgroud)

将"索引"上的列名更改为空字符串

new_cols = df.columns.values
new_cols[:2] = '',''  # since my index columns are the two left-most on the table
df.columns = new_cols 
Run Code Online (Sandbox Code Playgroud)

现在调用表函数,但将表中的所有行标签设置为空字符串(这样可以确保不显示绘图的实际索引):

table(ax, df, rowLabels=['']*df.shape[0], loc='center')
Run Code Online (Sandbox Code Playgroud)

et voila:

在此输入图像描述

你不那么漂亮但功能齐全的多索引表.

  • 这让我离得更近了。可悲的是,我之前看到过类似的东西,但我才意识到它不起作用,因为我使用的是过时的熊猫版本。除了两件事外,这似乎运作良好。1) 表格的一部分似乎总是在框架之外。我尝试了 `table(ax, df, loc='center')` 这有帮助,但左边的索引被切成两半。如果我使用 `plt.show()`,只要调整窗口大小,就会修复它。2) `table` 似乎不能处理多索引列。我的列显示为 ('A', '1'), ('A', '2') 而不是 2 行,因为 'A' 位于顶部并跨越 '1' 和 '2'。 (2认同)
  • 我们应该注意到 **a FutureWarning** 不推荐使用 `pandas.tools.plotting.table`,而是导入 `pandas.plotting.table`。 (2认同)

Aks*_*ode 33

实际上有一个叫做dataframe_image的python库就做一个

pip install dataframe_image
Run Code Online (Sandbox Code Playgroud)

做进口

import pandas as pd
import numpy as np
import dataframe_image as dfi
df = pd.DataFrame(np.random.randn(6, 6), columns=list('ABCDEF'))
Run Code Online (Sandbox Code Playgroud)

如果需要,可以通过以下方式设置表格样式:

df_styled = df.style.background_gradient() #adding a gradient based on values in cell
Run Code Online (Sandbox Code Playgroud)

最后:

dfi.export(df_styled,"mytable.png")
Run Code Online (Sandbox Code Playgroud)

  • `OSError: 在您的计算机上找不到 Chrome 可执行文件` 嗯...不确定我是否会在我的 upyter 计算实例上安装 chrome。 (16认同)
  • 一个简单而优雅的答案! (4认同)
  • 我尝试了这个,如果我添加 table_conversion = 'matplotlib' 选项来导出,则工作正常,因为我在 WSL 中使用 Chrome 时遇到问题。如果我删除 matplotlib 选项,则会出现以下错误,我需要在调用 Chrome 时添加无沙箱选项,但我找不到任何文档如何添加此选项。无法移动到新命名空间:支持 PID 命名空间、支持网络命名空间,但失败:errno = 权限被拒绝 (2认同)
  • 显示它的外观的图像会很有帮助。 (2认同)

nor*_*ok2 25

您的问题的最佳解决方案可能是:

df.to_html('table.html')
subprocess.call(
    'wkhtmltoimage -f png --width 0 table.html table.png', shell=True)
Run Code Online (Sandbox Code Playgroud)

但你需要得到wkhtmltoimage/ wkhtmltopdf你自己.还有一个Python软件包,pdfkit可以帮助您完成此任务,但我没有看到自己运行命令的优势.

我希望seaborn更加可定制(或者可能很容易定制:我在过去的30分钟内找不到合适的方法来修饰它).

在我的情况下,结果非常整洁,例如:

在此输入图像描述

如果您愿意,可以使用CSS进一步自定义.


jcd*_*ing 12

虽然我不确定这是否是您期望的结果,但您可以通过在带有注释的Seaborn Heatmap上绘制DataFrame来保存您的DataFrame,如下所示:

http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.heatmap.html#seaborn.heatmap

带有注释的Seaborn热图示例

它可以立即使用Pandas Dataframe.您可以查看此示例:使用Python有效地以csv格式绘制表格

您可能想要更改色彩映射,使其仅显示白色背景.

希望这可以帮助.


And*_*ndi 11

有一个名为 https://pypi.org/project/df2img/ 的 Python 库df2img免责声明:我是作者)。它是一个用作plotly后端的包装器/便利函数。

您可以在https://df2img.dev找到文档。

import pandas as pd

import df2img

df = pd.DataFrame(
    data=dict(
        float_col=[1.4, float("NaN"), 250, 24.65],
        str_col=("string1", "string2", float("NaN"), "string4"),
    ),
    index=["row1", "row2", "row3", "row4"],
)
Run Code Online (Sandbox Code Playgroud)

将 a 保存pd.DataFrame为 .png 文件可以相当快地完成。您可以应用格式设置,例如背景颜色或交替行颜色以获得更好的可读性。

fig = df2img.plot_dataframe(
    df,
    title=dict(
        font_color="darkred",
        font_family="Times New Roman",
        font_size=16,
        text="This is a title",
    ),
    tbl_header=dict(
        align="right",
        fill_color="blue",
        font_color="white",
        font_size=10,
        line_color="darkslategray",
    ),
    tbl_cells=dict(
        align="right",
        line_color="darkslategray",
    ),
    row_fill_color=("#ffffff", "#d7d8d6"),
    fig_size=(300, 160),
)

df2img.save_dataframe(fig=fig, filename="plot.png")
Run Code Online (Sandbox Code Playgroud)

pd.DataFrame png 文件


rag*_*ria 7

我对我正在做的项目有同样的要求。但是没有一个答案符合我的要求。这是最终帮助我的东西,可能对这种情况有用:

from bokeh.io import export_png, export_svgs
from bokeh.models import ColumnDataSource, DataTable, TableColumn

def save_df_as_image(df, path):
    source = ColumnDataSource(df)
    df_columns = [df.index.name]
    df_columns.extend(df.columns.values)
    columns_for_table=[]
    for column in df_columns:
        columns_for_table.append(TableColumn(field=column, title=column))

    data_table = DataTable(source=source, columns=columns_for_table,height_policy="auto",width_policy="auto",index_position=None)
    export_png(data_table, filename = path)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


jro*_*gno 5

@bunji的解决方案适用于我,但默认选项并非总能带来良好的效果。我添加了一些有用的参数来调整表的外观。

import pandas as pd
import matplotlib.pyplot as plt
from pandas.tools.plotting import table
import numpy as np

dates = pd.date_range('20130101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))

df.index = [item.strftime('%Y-%m-%d') for item in df.index] # Format date

fig, ax = plt.subplots(figsize=(12, 2)) # set size frame
ax.xaxis.set_visible(False)  # hide the x axis
ax.yaxis.set_visible(False)  # hide the y axis
ax.set_frame_on(False)  # no visible frame, uncomment if size is ok
tabla = table(ax, df, loc='upper right', colWidths=[0.17]*len(df.columns))  # where df is your data frame
tabla.auto_set_font_size(False) # Activate set fontsize manually
tabla.set_fontsize(12) # if ++fontsize is necessary ++colWidths
tabla.scale(1.2, 1.2) # change size table
plt.savefig('table.png', transparent=True)
Run Code Online (Sandbox Code Playgroud)

结果: 表


小智 5

如果您在编码环境中调用DataFrame时显示的格式正常,那么绝对最简单的方法是使用打印屏幕并使用基本图像编辑软件裁剪图像.

以下是使用Jupyter Notebook和Pinta Image Editor(Ubuntu免费软件)的原因.


归档时间:

查看次数:

64570 次

最近记录:

6 年,4 月 前