使用 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')
我正在使用 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')