【问题标题】:Count most frequent 100 words from sentences in Dataframe Pandas计算 Dataframe Pandas 中句子中最常见的 100 个单词
【发布时间】:2015-04-27 18:11:22
【问题描述】:

我在 Pandas 数据框中的一列中有文本评论,我想用它们的频率计数来计算 N 个最常见的单词(在整个列中 - 不是在单个单元格中)。一种方法是使用计数器通过遍历每一行来计算单词。有更好的选择吗?

代表性数据。

0    a heartening tale of small victories and endu
1    no sophomore slump for director sam mendes  w
2    if you are an actor who can relate to the sea
3    it's this memory-as-identity obviation that g
4    boyd's screenplay ( co-written with guardian

【问题讨论】:

  • 将数据发布为表格而不是图像通常会有所帮助。
  • 感谢 John 的建议,我确实尝试使用 html 制作有问题的表格,但它不起作用,所以我懒洋洋地发布了一张图片:(。
  • 数据不必总是完整的。在大多数情况下,您需要有代表性的数据。
  • 谢谢@JohnGalt 我明白了,下次我会更好地提出我的问题。

标签: python pandas


【解决方案1】:
from collections import Counter
Counter(" ".join(df["text"]).split()).most_common(100)

我很确定会给你想要的(在调用 most_common 之前,你可能需要从计数器结果中删除一些非单词)

【讨论】:

  • 这会给出字符数而不是字数,可能吗?
  • 哎呀修复了:P 谁是 John Galt?
  • 补充一点,我可以考虑先将列小写,然后取Counter(" ".join(df["text"].str.lower()).split()).most_common(100)这样的结果? Mymy 应该被当作一个词来处理?
  • 有趣的是,您可能会从基准测试中注意到value_countsCounter 更快。
  • 在复制粘贴之前,必须执行“从集合导入计数器”
【解决方案2】:

除了@Joran 的解决方案,您还可以使用series.value_counts 处理大量文本/行

 pd.Series(' '.join(df['text']).lower().split()).value_counts()[:100]

您会从基准测试中发现 series.value_counts 似乎比 Counter 方法快两倍 (2X)

对于 3000 行的电影评论数据集,总共 400K 字符和 70k 单词。

In [448]: %timeit Counter(" ".join(df.text).lower().split()).most_common(100)
10 loops, best of 3: 44.2 ms per loop

In [449]: %timeit pd.Series(' '.join(df.text).lower().split()).value_counts()[:100]
10 loops, best of 3: 27.1 ms per loop

【讨论】:

  • 这有点令人惊讶,一个(我)会认为迭代和更新一个 Counter 会比进行字符串操作更快,更不用说建立一个系列了。但事实证明,更新而不是拆分是缓慢的部分......(并且 pandas 使用 cython/klib 而不是普通的 dict)。
【解决方案3】:

我将不得不不同意@Zero

对于 91,000 个字符串(电子邮件地址),我发现 collections.Counter(..).most_common(n) 更快。 然而, series.value_counts 如果它们超过 500k 字,可能仍然更快

%%timeit
[i[0] for i in Counter(data_requester['requester'].values).most_common(5)]
# 13 ms ± 321 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
data_requester['requester'].value_counts().index[:5]
# 22.2 ms ± 597 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2015-08-18
    • 2022-12-05
    相关资源
    最近更新 更多