【问题标题】:Word frequency by iterating over a list of dictionaries - python通过迭代字典列表的词频 - python
【发布时间】:2022-01-04 15:47:24
【问题描述】:

关于上一个问题,我希望遍历字典列表并将输出转换为新的数据框。现在,我有一个包含两列的 CSV。一列带有单词,另一列带有 URL(见下文)。

| Keyword  | URL                     | 
| -------- | --------------          |
| word1    | www.example.com/topic-1 |
| word2    | www.example.com/topic-2 |
| word3    | www.example.com/topic-3 |
| word4    | www.example.com/topic-4 |

我已将此 CSV 文件转换为字典列表,并尝试遍历这些列表以计算单词在 URL 上显示的频率。

我的代码可以在this colab notebook看到。

我希望最终输出如下所示:

| Keyword | URL                        | Count |
|:----    |:------:                    | -----:|
| word1   | www.example.com/topic-1    | 1003  |
| word2   | www.example.com/topic-2    | 405   |
| word3   | www.example.com/topic-3    | 123   |
| word4   | www.example.com/topic-4    | 554   |

'Count' 列是 'word1''www.example.com/topic-1' 上出现的频率。

感谢任何帮助!

【问题讨论】:

标签: python pandas dictionary beautifulsoup word-count


【解决方案1】:

使用DataFrame.apply 使用其他列的函数创建新列:

import pandas as pd
import requests

df = pd.DataFrame({'Keyword': ['code', 'apply', 'midnight'],
                   'URL': ['https://stackoverflow.com/questions/70581444/word-frequency-by-iterating-over-a-list-of-dictionaries-python/',
                           'https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html',
                           'https://stackoverflow.com/questions/62694219/minimum-number-of-platforms-required-for-a-railway-station'
                          ]})

print(df)
#     Keyword                                                URL
# 0      code  https://stackoverflow.com/questions/70581444/w...
# 1     apply  https://pandas.pydata.org/docs/reference/api/p...
# 2  midnight  https://stackoverflow.com/questions/62694219/m...



def get_count(row):
    r = requests.get(row['URL'], allow_redirects=False)
    count = r.text.lower().count(row['Keyword'].lower())
    return count

df['Count'] = df.apply(get_count, axis=1)

print(df)
#     Keyword                                                URL  Count
# 0      code  https://stackoverflow.com/questions/70581444/w...     32
# 1     apply  https://pandas.pydata.org/docs/reference/api/p...     32
# 2  midnight  https://stackoverflow.com/questions/62694219/m...     18

【讨论】:

  • 谢谢!这无疑为我指明了正确的方向。但是,“计数”列没有加起来。例如,当我在示例中使用的 stackoverflow URL 上为“代码”执行 Ctrl/F 时,我总共得到 6 个而不是 32 个。这可能是关闭的原因吗?
  • @AlexFuss : apply() 是您的方法-关于您的示例-这取决于计数的方式/位置/内容-如果您只想将自己限制在人类可读的文本中,我建议您使用关注soup=BeautifulSoup(r.text, 'lxml') count = soup.body.get_text(strip=True).lower().count(row['Keyword'].lower()) -- 否则你还会计算标题、元数据...
  • @HedgeHog 完美运行!非常感谢您的帮助
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 2012-09-01
  • 1970-01-01
相关资源
最近更新 更多