使用 python-docx 迭代数据框中的值以打印到 Word

Iterate values in dataframe to print to Word using python-docx

我正在使用 pandas 数据框,其中包含标题、来源以及指向来自 GoogleNews API 的各种新闻文章的链接。然后我将数据分类为我用来查找文章的各种关键字。我正在尝试遍历 'keyword' 列以整齐地打印数据,然后使用 python-docx.

将迭代导出到 Word

为了提取 GoogleNews 数据,我使用了一个 for 循环,在列表中设置了各种关键字。看起来像:

for i in list:
    googlenews=GoogleNews()
    googlenews.get_news(i)
    googlenews.set_lang('en')
    googlenews.set_period('1d')
    result=googlenews.result()
    df_ivar = pd.DataFrame(result)
    df_ivar = df_ivar[df_ivar['date'].notna()]
    df_ivar = df_ivar[df_ivar["date"].str.contains('hours ago')] # to only pull articles from within the last 24 hours
    df_ivar = df_ivar[['site', 'title', 'desc', 'link']]
    df_ivar['keyword'] = i
    df = df_ivar.append(df, ignore_index=True)

到目前为止,我找到了一种正确打印数据的方法,但我找不到一种方法只显示每个关键字一次,然后在相应关键字下方打印所有文章标题、描述和链接。

我的数据目前是这样的:

article 1    link 1    description 1    keyword 1
article 2    link 2    description 2    keyword 1
article 3    link 3    description 3    keyword 2
article 4    link 4    description 4    keyword 3

导出时,我希望python-docx文档能分类显示数据,如:

keyword 1
article 1
article 2

keyword 2
article 3

keyword 3
article 4

我有 python-docx 脚本,但每次我打印文档时,我都坚持在每篇文章名称之前显示关键字,而我只是希望关键字显示一次,以及在其下方发布的任何相关文章。目前,我的 for 循环看起来像:

for i in df.index:
    document.add_heading(df['keyword'][i], level=1)
    p = document.add_paragraph().add_run(dfs['title'][i]).underline = True
    document.add_paragraph(df['desc'][i], style='List Bullet')
    document.add_paragraph(df['link'][i], style='List Bullet')
    document.add_paragraph('Source: ' + df['site'][i], style='List Bullet')

如有任何帮助或指导,我们将不胜感激!提前致谢!

您可以使用 Pandas groupby 并使用 keyword 作为参数。此函数的 return 将是组的名称(在本例中为 keyword)和此关键字的 dataframe。然后,您可以将 name 用于 add_heading 函数,并使用您已经构建的剩余逻辑,但迭代组变量 (for i in g.index).

for name, g in df.groupby('keyword'):
    document.add_heading(name, level=1)
    for i in g.index:
        p = document.add_paragraph().add_run(df['title'][i]).underline = True
        document.add_paragraph(df['desc'][i], style='List Bullet')
        document.add_paragraph(df['link'][i], style='List Bullet')
        document.add_paragraph('Source: ' + df['site'][i], style='List Bullet')