【问题标题】:Export a Pandas dataframe as a table image将 Pandas 数据框导出为表格图像
【发布时间】:2014-12-27 23:56:30
【问题描述】:

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

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

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

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以查看 dataframe-image 包 (https://pypi.org/project/dataframe-image/),它提供了将(样式化的)数据框导出为图像文件的可能性。下图显示了如何实现这一点的示例(我从上述网页复制)。

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

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

      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)
      

      【讨论】:

      • 我收到错误ImportError: No module named externals
      • 六个在标准库中。我已经调整了答案。它现在应该可以工作了-感谢您的指点。它是编写 Python 2 和 Python 3 兼容的代码。你只需要 Python 3 吗?
      • @zerohedge 我修改了这个答案中的函数以吐出斧头和无花果,并使用了 fig.savefig()
      • 虽然您当然可以在函数中输出 fig 和保存图像,但通常建议让函数只做一件事。保存图形与制作图形不同 - 有格式选项、dpi 设置等。在我们的设置中,保存到 .png(并将这些 .png-s 添加到谷歌幻灯片中)由不同的方法处理。而且,你总是可以从轴ax.get_figure()得到一个数字,所以输出两者都是多余的(但是很方便,所以你不需要调用ax.get_figure())。
      • 这是一个很好的答案@volodymyr 非常感谢 muhc。反正有没有根据它们的长度“自动调整”的列?谢谢
      【解决方案4】:

      如果你安装了 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])
      

      如果你安装 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])
      

      【讨论】:

      • 我似乎通过编码乳胶字符串 f.write(bytes(template.format(df.to_latex()),'UTF-8')) 使乳胶版本在 Python 3 中工作。
      • 或者以'wt'模式打开文件
      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多