Ich versuche, einen Datenrahmen mit Multi-Index in einem Bericht in PDF aufzunehmen. Ich hätte gerne eine schöne Tabellenausgabe. > HTML - -> pdfSpeichern Sie ein Pandas Dataframe als Tabelle in Bild oder PDF-Dokument mit schönen Multi-Index-Anzeige
import pandas as pd
from IPython.display import HTML
import pdfkit
# df generation
df = pd.read_csv(path_to_csv, sep =',')
groupeddf = df.groupby('Cluster')
res = groupeddf.describe([0.05, 0.5, 0.95])
res.index.rename(['Cluster', 'stats'], inplace=True)
res['Cluster'] = res.index.get_level_values('Cluster')
res['stats'] = res.index.get_level_values('stats')
populations = (res.iloc[(res.index.get_level_values('stats') == 'count'), \
0].values).tolist()
res['population'] = [populations[i] for i in res.index.labels[0].values()]
total_pop = sum(populations)
res['frequency'] =(res['population']/total_pop).round(3)
res.set_index(['Cluster', 'population','frequency', 'stats'], inplace=True)
res1 = res.iloc[(res.index.get_level_values('stats') == '5%') |
(res.index.get_level_values('stats') == 'mean') |
(res.index.get_level_values('stats') == '50%') |
(res.index.get_level_values('stats') == '95%')]
res1 = res1.round(2)
# saving the df
h = HTML(res1.to_html())
my_file = open('test.html', 'w')
my_file.write(h.data)
my_file.close()
options = {
'orientation': 'Landscape'
}
with open('test.html') as f:
pdfkit.from_file(f, 'out.pdf', options=options)
Das hat aber eine Abhängigkeit von pdfkit
, die es uns schwer machen
pandas.df:
Ich habe diese zwei Lösungen gefunden. Deshalb versuche ich, pandas.df zu verwenden -> tex -> pdf (wie in Export a Pandas dataframe as a table image erwähnt)
import pandas as pd
import os
# df generation
df = pd.read_csv(path_to_csv, sep =',')
groupeddf = df.groupby('Cluster')
res = groupeddf.describe([0.05, 0.5, 0.95])
res.index.rename(['Cluster', 'stats'], inplace=True)
res['Cluster'] = res.index.get_level_values('Cluster')
res['stats'] = res.index.get_level_values('stats')
populations = (res.iloc[(res.index.get_level_values('stats') == 'count'), \
0].values).tolist()
res['population'] = [populations[i] for i in res.index.labels[0].values()]
total_pop = sum(populations)
res['frequency'] =(res['population']/total_pop).round(3)
res.set_index(['Cluster', 'population','frequency', 'stats'], inplace=True)
res1 = res.iloc[(res.index.get_level_values('stats') == '5%') |
(res.index.get_level_values('stats') == 'mean') |
(res.index.get_level_values('stats') == '50%') |
(res.index.get_level_values('stats') == '95%')]
res1 = res1.round(2)
res1.rename(columns=lambda x: x.replace('_', ' '), inplace=True)
#latex
template = r'''\documentclass[preview]{{standalone}}
\usepackage{{booktabs}}
\begin{{document}}
{}
\end{{document}}
'''
with open("outputfile.tex", "wb") as afile:
afile.write(template.format(res1.to_latex()))
os.system("pdflatex outputfile.tex")
Allerdings bin ich nicht vertraut mit Latex, und ich bekomme diese Fehlermeldung:
! LaTeX Error: File `standalone.cls' not found.
Type X to quit or <RETURN> to proceed,
or enter a new name. (Default extension: cls)
Irgendeine Idee über den Fehler oder die Standardmethode, pandas.df zu machen -> pdf?
Die erste Lösung, die ich geschrieben habe (df -> HTML -> pdf) auf meinem Rechner arbeiten, aber der Code kann nicht Führen Sie eine entfernte Maschine aus, auf der ich nicht die Rechte habe, PDFkit zu installieren. Ich denke, ich würde für makedown-pdf dasselbe sein. Deshalb muss ich die Abhängigkeiten so stark wie möglich begrenzen. –
markdown-pdf ist nicht in der Lage, die PDF-Datei so zu skalieren, dass sie nur die Tabelle enthält – Chaoste