在 ReportLab 中迭代 DataFrame
Iterating over a DataFrame in ReportLab
我想遍历 DataFrame (df) 为每家医院('A' 和 'B')生成一个 PDF。我尝试了很多方法,但没有成功,除非我用 np.random.rand(1) 将名称设为随机数,但仍然有问题。更新:
我希望 .pdf 的名称是每次迭代的医院名称。如果我尝试添加医院名称,则会导致错误:
当我设置时:
pdf_file_name = str(np.random.rand(1))+'.pdf'
结果是:
OSError: [Errno 22] Invalid argument: '0 A\nName: Hospital, dtype: object.pdf'
所以我需要弄清楚如何:
1.将医院名称传入文件名,
2. 遍历医院名称,为每个医院生成一个 PDF。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.pagesizes import portrait
from reportlab.platypus import Image
import pandas as pd
import numpy as np
df = pd.DataFrame({'Hospital':['A','B']})
#This is here to just produce one report that "works" while working on the code.
df = df[(df.Hospital == 'A')]
hospital = df['Hospital']
def import_data(df):
import numpy as np
hospital = df['Hospital']
pdf_file_name = str(np.random.rand(1))+'.pdf'
generate_report(hospital, pdf_file_name)
def generate_report(hospital, pdf_file_name):
c = canvas.Canvas(pdf_file_name, pagesize=portrait(letter))
c.setFont('Helvetica', 48, leading=None)
c.drawCentredString(415, 500, 'Report')
c.setFont('Helvetica', 24, leading=None)
c.drawCentredString(415, 450, 'This Report is For:')
c.setFont('Helvetica-Bold', 34, leading=None)
c.drawCentredString(415, 395, str(hospital))
c.showPage()
c.save()
import_data(df)
提前致谢!
IIUC,你可以这样做
def import_data(df):
for hospital, hosp_df in df.groupby("Hospital"):
pdf_file_name = hospital + '.pdf'
generate_report(hospital, pdf_file_name)
df = pd.DataFrame({'Hospital':['A','B'], 'Other': [1,2]})
import_data(df)
这会为我生成两个文件,一个名为 A.pdf
,第二个名为 B.pdf
,每个文件都显示 "Report / This Report is For: / A"(或 B)。
目前我们没有对 hosp_df
做任何事情,看起来像
A
Hospital Other
0 A 1
和
B
Hospital Other
1 B 2
但您也可以将 hosp_df
传递给 generate_report
并使用该医院特定数据做任何您想做的事情。
我想遍历 DataFrame (df) 为每家医院('A' 和 'B')生成一个 PDF。我尝试了很多方法,但没有成功,除非我用 np.random.rand(1) 将名称设为随机数,但仍然有问题。更新: 我希望 .pdf 的名称是每次迭代的医院名称。如果我尝试添加医院名称,则会导致错误:
当我设置时:
pdf_file_name = str(np.random.rand(1))+'.pdf'
结果是:
OSError: [Errno 22] Invalid argument: '0 A\nName: Hospital, dtype: object.pdf'
所以我需要弄清楚如何: 1.将医院名称传入文件名, 2. 遍历医院名称,为每个医院生成一个 PDF。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.pagesizes import portrait
from reportlab.platypus import Image
import pandas as pd
import numpy as np
df = pd.DataFrame({'Hospital':['A','B']})
#This is here to just produce one report that "works" while working on the code.
df = df[(df.Hospital == 'A')]
hospital = df['Hospital']
def import_data(df):
import numpy as np
hospital = df['Hospital']
pdf_file_name = str(np.random.rand(1))+'.pdf'
generate_report(hospital, pdf_file_name)
def generate_report(hospital, pdf_file_name):
c = canvas.Canvas(pdf_file_name, pagesize=portrait(letter))
c.setFont('Helvetica', 48, leading=None)
c.drawCentredString(415, 500, 'Report')
c.setFont('Helvetica', 24, leading=None)
c.drawCentredString(415, 450, 'This Report is For:')
c.setFont('Helvetica-Bold', 34, leading=None)
c.drawCentredString(415, 395, str(hospital))
c.showPage()
c.save()
import_data(df)
提前致谢!
IIUC,你可以这样做
def import_data(df):
for hospital, hosp_df in df.groupby("Hospital"):
pdf_file_name = hospital + '.pdf'
generate_report(hospital, pdf_file_name)
df = pd.DataFrame({'Hospital':['A','B'], 'Other': [1,2]})
import_data(df)
这会为我生成两个文件,一个名为 A.pdf
,第二个名为 B.pdf
,每个文件都显示 "Report / This Report is For: / A"(或 B)。
目前我们没有对 hosp_df
做任何事情,看起来像
A
Hospital Other
0 A 1
和
B
Hospital Other
1 B 2
但您也可以将 hosp_df
传递给 generate_report
并使用该医院特定数据做任何您想做的事情。