2016-07-31 15 views
0

Ich bin an einem Punkt fest, wo ich mehrere Pandas Datenframes in eine PDF-Datei schreiben muss.Die Funktion akzeptiert Dataframe als Eingabe.Schreiben Sie mehrere Datenframes in dieselbe PDF-Datei mit Matplotlib

Ich kann jedoch zum ersten Mal in PDF schreiben, aber alle nachfolgenden Aufrufe überschreiben die vorhandenen Daten, so dass am Ende nur noch ein einziger Datensatz im PDF vorhanden ist.

finden Sie die Python-Funktion unten:

def fn_print_pdf(df): 
pp = PdfPages('Sample.pdf') 
total_rows, total_cols = df.shape; 

rows_per_page = 30; # Number of rows per page 
rows_printed = 0 
page_number = 1; 
while (total_rows >0): 
    fig=plt.figure(figsize=(8.5, 11)) 
    plt.gca().axis('off') 
    matplotlib_tab = pd.tools.plotting.table(plt.gca(),df.iloc[rows_printed:rows_printed+rows_per_page], 
     loc='upper center', colWidths=[0.15]*total_cols) 
    #Tabular styling 
    table_props=matplotlib_tab.properties() 
    table_cells=table_props['child_artists'] 
    for cell in table_cells: 
     cell.set_height(0.024) 
     cell.set_fontsize(12) 
    # Header,Footer and Page Number 
    fig.text(4.25/8.5, 10.5/11., "Sample", ha='center', fontsize=12) 
    fig.text(4.25/8.5, 0.5/11., 'P'+str(page_number), ha='center', fontsize=12) 
    pp.savefig() 
    plt.close() 
    #Update variables 
    rows_printed += rows_per_page; 
    total_rows -= rows_per_page; 
    page_number+=1; 
pp.close() 

Und ich rufe diese Funktion als ::

raw_data = { 
     'subject_id': ['1', '2', '3', '4', '5'], 
     'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 
     'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']} 
df_a = pd.DataFrame(raw_data, columns=['subject_id', 'first_name', 'last_name']) 
fn_print_pdf(df_a) 

raw_data = { 
    'subject_id': ['4', '5', '6', '7', '8'], 
    'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
    'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']} 
df_b = pd.DataFrame(raw_data, columns=['subject_id', 'first_name', 'last_name']) 
fn_print_pdf(df_b) 

PDF-Datei auf SamplePDF .Als verfügbar ist nur der sehen kann Daten aus dem zweiten Datenframe werden letztendlich gespeichert. Gibt es eine Möglichkeit, im zweiten Durchlauf an dieselbe Sample.pdf usw. anzuhängen, während die früheren Daten erhalten bleiben?

+0

Wenn Sie in einer Tabelle müssen alle Daten, eine verkettete df in einem Aufruf an: 'fn_print_pdf (pd. concat ([df_a, df_b])) ' – Parfait

Antwort

1

Ihre PDFs werden überschrieben, da Sie jedes Mal ein neues PDF-Dokument erstellen, wenn Sie fn_print_pdf() anrufen. Sie können versuchen, Ihre PdfPages Instanz zwischen Funktionsaufrufen offen zu halten und erst nach dem Schreiben aller Plots einen Aufruf an pp.close() zu tätigen. Als Referenz siehe this answer.

Eine weitere Möglichkeit besteht darin, die PDFs in eine andere Datei zu schreiben und pyPDF zu verwenden, um sie zusammenzuführen, siehe this answer.

Edit: Hier ist ein Arbeitscode für den ersten Ansatz.

def fn_print_pdf(df,pp): 
total_rows, total_cols = df.shape; 

rows_per_page = 30; # Number of rows per page 
rows_printed = 0 
page_number = 1; 
while (total_rows >0): 
    fig=plt.figure(figsize=(8.5, 11)) 
    plt.gca().axis('off') 
    matplotlib_tab = pd.tools.plotting.table(plt.gca(),df.iloc[rows_printed:rows_printed+rows_per_page], 
     loc='upper center', colWidths=[0.15]*total_cols) 
    #Tabular styling 
    table_props=matplotlib_tab.properties() 
    table_cells=table_props['child_artists'] 
    for cell in table_cells: 
     cell.set_height(0.024) 
     cell.set_fontsize(12) 
    # Header,Footer and Page Number 
    fig.text(4.25/8.5, 10.5/11., "Sample", ha='center', fontsize=12) 
    fig.text(4.25/8.5, 0.5/11., 'P'+str(page_number), ha='center', fontsize=12) 
    pp.savefig() 
    plt.close() 
    #Update variables 
    rows_printed += rows_per_page; 
    total_rows -= rows_per_page; 
    page_number+=1; 

Ihre Funktion mit Rufen:

Ihre Funktion wird geändert

pp = PdfPages('Sample.pdf') 
fn_print_pdf(df_a,pp) 
fn_print_pdf(df_b,pp) 
pp.close() 
+0

Großartig ... es funktionierte .. die Verwendung von pp über die Sitzung hinweg gearbeitet ... Vielen Dank für Ihre Hilfe :) – Sri