【问题标题】:Pandas DataFrames in reportlab报告实验室中的熊猫数据框
【发布时间】:2013-07-09 07:33:18
【问题描述】:

我有一个 DataFrame,想将其输出为 pdf。我目前正在尝试为此使用 ReportLab,但它似乎不起作用。我在这里遇到错误:

        mytable = Table(make_pivot_table(data, pivot_cols, column_order, 'criterion'))

make_pivot_table 只是使用 pandas pivot_table 函数返回一个数据透视表。 我得到的错误是

ValueError: <Table@0x13D7D0F8 unknown rows x unknown cols>... invalid data type

我的问题是:

  1. 有什么方法可以让reportlab 使用DataFrames?
  2. 如果不是,我可以使用什么包来达到同样的目的?

【问题讨论】:

  • 所以问题与 pivot_table 无关?但它是 Table 类,那是什么?您能否举一个表现出这种行为的 DataFrame 的简单示例(它适用于df = pd.DataFrame([[1, 2], [3, 4]]) 吗?)
  • 对不起,是的,这与 DataFrame 而不是 pivot_table 有关。它不适用于您的示例。
  • 也许改用那个例子是有意义的(如果我们可以重新创建错误会有所帮助)...pivot_colscolumn_order 变量是什么?
  • 您的示例重新创建了相同的错误。我认为只是 Table 不会采用 DataFrame。我知道 make_pivot_table 返回的只是一个 DataFrame。 Table 文档说它可以接受任何可转换为字符串的东西,我认为这基本上是任何东西。它需要 numpy 数组,所以我认为它也需要 DataFrames。好像没有
  • 我也遇到过类似的问题。将 pandas 和 matplotlib 生成的对象输出为 pdf。最终决定自己写,我决定使用乳胶作为 pdf 引擎。 Latex 在几乎所有的格式化任务上都很出色。不得不重写代码以获取 pandas 数据帧(to_latex 方法相当有限)。我必须处理的具体问题是多页 pandas 数据帧到乳胶,以及处理多索引数据帧进入乳胶。我对编码比较陌生,所以我的代码相当不优雅。如果你有兴趣,我很乐意分享我的代码。

标签: python python-2.7 pandas reportlab


【解决方案1】:

你好,

我还需要以 .pdf 格式打印一些 Pandas DataFrame 来安排报告。我直接用 df 尝试了 ReportLab 并有一个“AttributeError:'DataFrame'对象没有属性'split'。”我尝试使用 df.values() 并出现“TypeError: 'numpy.ndarray' object is not callable”。

当接近放弃构建 .pdf 报告的想法时,我尝试了 str(df),我在 .pdf 中得到了一些结果 :-) ... 代码如下所示:

import pandas as pd
from reportlab.pdfgen import canvas
PATH_OUT = "C:\\"
def pdf_df(c, testo, x, y):
    c.drawAlignedString(x,y, testo)
df = pd.DataFrame({'a':[3,4,5], 'b':[6,7,6],'c':[9,10,11]})
print df, type(df)
print''
df1 = (df['a'].groupby([df['b'], df['a']])).sum()
print df1, type(df1)
print ''
c = canvas.Canvas(PATH_OUT + 'out.pdf')
pdf_df (c, str(df), 300, 500)
pdf_df (c, str(df1), 300, 480)
c.showPage()
c.save()  

你怎么看?这可能有意义还是可能有一些“更聪明”的方式?

这似乎不是那么有效,我最初希望从 ReportLab 获得。看来我需要一些方法来换行......尺寸会改变......

法比奥

=====

我现在对下面的解决方案更满意,而我对上面的解决方案也不满意。

这是基于 ReportLab 网格的,它们适用于列表。因此代码将 DF 转换为列表,然后将其视为 ReportLab 网格:-)

这里是:

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import *
from reportlab.lib import colors
import pandas as pd
import random

PATH_OUT = "C:\\"

elements = []
styles = getSampleStyleSheet()
doc = SimpleDocTemplate(PATH_OUT + 'Report_File.pdf')
elements.append(Paragraph("Report Title", styles['Title']))

data = [[random.random() for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist()

ts = [('ALIGN', (1,1), (-1,-1), 'CENTER'),
     ('LINEABOVE', (0,0), (-1,0), 1, colors.purple),
     ('LINEBELOW', (0,0), (-1,0), 1, colors.purple),
     ('FONT', (0,0), (-1,0), 'Times-Bold'),
     ('LINEABOVE', (0,-1), (-1,-1), 1, colors.purple),
     ('LINEBELOW', (0,-1), (-1,-1), 0.5, colors.purple, 1, None, None, 4,1),
     ('LINEBELOW', (0,-1), (-1,-1), 1, colors.red),
     ('FONT', (0,-1), (-1,-1), 'Times-Bold'),
     ('BACKGROUND',(1,1),(-2,-2),colors.green),
     ('TEXTCOLOR',(0,0),(1,-1),colors.red)]

table = Table(lista, style=ts)
elements.append(table)

doc.build(elements)

我真的很想了解其他可能的解决方案..

再见,法比奥。

【讨论】:

  • 感谢您的回答!不过,这似乎不是一种很好的处理方式,尤其是对于不同大小的大桌子。尽管如此,感谢您的帮助。
  • 是的 :-( .. 我完全同意 .. 但到目前为止我还没有找到更好的东西 .. 我是新手,我希望也有一些建议关于如何在 ReportLab 中处理 DataFrames ...关于关于换行的待处理项目我在 for 循环中通过 str(df).splitlines() 获得了一些不错的结果来绘制画布。作者 Fabio。
  • 效果很好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多