猿问

使用 Jinja2 使用 GroupBy 并将 Pandas Dataframe 渲染为单独的

我的目标是获取 Pandas 数据框,按列对其进行分组,并将列中的每个组呈现为新的 HTML 文件,最终将其转换为 PDF 文件。

使用链接问题中的示例数据:

     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

如果我不想为 中的每一项创建一个包含单独表格的 html 文件Clothing,而是想创建多个 html 文件——每个文件包含一个用于一种颜色的表格:我该怎么做?


此代码根据我选择的组(在本例中为 的唯一值)成功地将我的数据框呈现Color为具有多个表的单个 HTML 文件。


我需要扩展代码,这意味着无需df['Color']提前对 的唯一值进行硬编码。


import pandas as pd

from jinja2 import Environment


df = pd.DataFrame([('Shirt','Blue','M'), ('Shirt','Blue','L'), ('Shirt','Black','L'), ('Pants','Black','L'), ('Pants','Blue','XL'), ('Jacket','Blue','L'), ('Jacket','Brown','L')], columns=['Clothing', 'Color', 'Size'])


env = Environment()

tmpl = env.from_string( '''

{% for df_split in df_splits %}

<div>

{{df.loc[df['Color'] == df_split].to_html()}}

</div>

{% endfor %}''')


print(tmpl.render(df=df,df_splits = df['Color'].unique()))

谢谢!


紫衣仙女
浏览 132回答 1
1回答

凤凰求蛊

您可以使用 . 在循环内创建文件groupby()。这是一个例子:tmpl = env.from_string("""&nbsp; &nbsp; <div>&nbsp; &nbsp; {{ df.to_html(index=False) }}&nbsp; &nbsp; </div>""")for color_name, group_df in df.groupby(['Color']):&nbsp; &nbsp; content = tmpl.render(df=group_df)&nbsp; &nbsp; file_path = '/tmp/{f_name}.html'.format(f_name=color_name)&nbsp; &nbsp; with open(file_path, 'w+') as file:&nbsp; &nbsp; &nbsp; &nbsp; print('writing to file {f}'.format(f=file_path))&nbsp; &nbsp; &nbsp; &nbsp; # print(content)&nbsp; # check content before write if you need&nbsp; &nbsp; &nbsp; &nbsp; file.write(content)&nbsp; &nbsp; # check content after write if you need&nbsp; &nbsp; # with open(file_path) as file:&nbsp; &nbsp; #&nbsp; &nbsp; &nbsp;print('reading file {f}. content:'.format(f=file_path))&nbsp; &nbsp; #&nbsp; &nbsp; &nbsp;print(file.read())
随时随地看视频慕课网APP

相关分类

Python
我要回答