Я работаю над проектом, в котором я загружаю файл .csv в фрейм данных pandas и создаю отчет .PDF, используя Python 3.6 + pandas + jinja2 + weasyprint.
csv -> pandas ->jinja2 -> weasyprint
Вот мой вызов: Один из фреймов данных pandas содержит информацию, которую я хочу разделить на уникальные записи в одном из его столбцов, а затем отобразить отдельные таблицы в jinja2 для каждогоиз этих расколов.
Пример фрейма данных:
Clothing Color Size
0 Shirt Blue M
1 Shirt Blue L
2 Shirt Black L
3 Pants Black L
4 Pants Blue XL
5 Jacket Blue L
6 Jacket Brown L
Я могу успешно отправить этот единственный фрейм данных Pandas в jinja2 в целом, назначив df.to_html () jinja2 template_vars.
template_vars = {"title" : "My Title",
"df": df.to_html()
}
, а затем в файле template.html, вызывая его, указав:
<div class="table_standard campaign_kpis_table">
{{ campaign_kpis }}
</div>
Теперь я хочу иметь возможность взять фрейм данных Pandas и разделить его на несколько фреймов данных на основе уникальногопредметы в одном столбце.В этом примере «Цвет».
Я могу сделать это, используя:
df_splits = (df['Color'].unique())
Затем, зная все уникальные записи, я могу перебрать их и получить отдельный "фрейм" для фрейма данных,Скажите, пожалуйста, есть ли здесь слово лучше, чем «разделить», и я отредактирую.:)
Так что я могу легко распечатать эти отдельные сплиты в терминале, выполнив что-то вроде:
for df_split in df_splits:
df_split = df.loc[df['Color']==df_split]
print (df_split)
Но как отослать их в jinja2 для отображения в виде отдельных таблиц?
Для моих целей в исходном фрейме данных может быть от 1 до 10 уникальных цветов.Количество уникальных записей всегда будет меняться, в зависимости от того, что на складе.Насколько я понимаю, это создаст от 1 до 10 отдельных разбиений фрейма данных.
Что я пишу, чтобы jinja2 создавал таблицы для каждого из этих разбиений данных?
Пожалуйста, дайте мне знать, если вам нужно больше кода, или я не смог адекватно объяснить мою ситуацию.
Полный код раздела "-> jinja2 -> weasyprint" основан на https://pbpython.com/pdf-reports.html.
В настоящее время он выглядит следующим образом:
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template("templates/template.html")
template_vars = {"df": df.to_html(),
}
html_out = template.render(template_vars)
with open("/path/to/report.html", "w") as fh:
fh.write(html_out)
from weasyprint import HTML
HTML(string=html_out).write_pdf("/path/to/report.pdf", stylesheets=["templates/style.css"])