Py
Hallo,
Я также необходимости печатать в .pdf какой панды DataFrame организовать отчеты. Я попробовал ReportLab напрямую с df и имел объект AttributeError: DataFrame, который не имеет атрибута split. Я попытался с df.values () и имел «TypeError: объект numpy.ndarray» не вызываемый ».
Когда близко бросить идею построить отчет в формате .pdf я попробовал ул (ДФ), и я имел некоторые итоги в формате .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)
Я действительно интересно читать о других возможных решений ..
Bye, Фабио.
Значит, проблема не имеет ничего общего с pivot_table? Но это класс Table, что это? Можете ли вы привести простой пример DataFrame, который проявляет это поведение (работает ли он для 'df = pd.DataFrame ([[1, 2], [3, 4]])??) –
К сожалению, это связано с DataFrame, а не pivot_table. Это не работает для вашего примера. –
Возможно, имеет смысл использовать этот пример (это поможет, если мы сможем воссоздать ошибку) ... что такое переменные 'pivot_cols' и' column_order'? –