【问题标题】:Word frequencies in Pandas listPandas 列表中的词频
【发布时间】:2017-10-30 16:13:31
【问题描述】:

我在 pandas df 中有一列标记化、词形还原的文本。我正在尝试创建一个词频矩阵,以便我可以继续进行降维。

我一直遇到一个错误,即 Python 需要一个字符串但得到一个列表。 TypeError: sequence item 0: expected str instance, list found

我尝试了几种方法,但每次都遇到错误。我不确定如何计算列表。

以下是我尝试过的一些方法:

选项 1:

from collections import Counter
df['new_col'] = Counter()
for token in df['col']:
    counts[token.orth_] += 1

这会生成ValueError: Length of values does not match length of index

选项 2:

Counter(' '.join(df['col']).split()).most_common()

其中生成:TypeError: sequence item 0: expected str instance, list found

选项 3:

pd.Series(values = ','.join([(i) for i in df['col']]).lower().split()).value_counts()[:]

再次生成:TypeError: sequence item 0: expected str instance, list found

编辑:示例数据:

col
[indicate, after, each, action, step, .]
[during, september, and, october, please, refrain]
[the, work, will, be, ongoing, throughout, the]
[professional, development, session, will, be]

【问题讨论】:

  • 如果您希望解决该问题,请通过示例提供可重现的错误。现在,您要求社区花费精力尝试对导致错误的数据帧进行逆向工程......
  • 你能放一个df['col']的样本
  • @Bharath 添加了一个示例
  • @LMGagne,您已经完成了部分工作,但请考虑使用 CountVectorizer,尤其是在您词汇量很大的情况下。
  • 您能否查看现有答案并在他们回答您的问题时批准它们或进一步澄清您的需求?谢谢。

标签: python python-3.x pandas nlp spacy


【解决方案1】:

简单回答

根据您告诉我们的情况,9dogs 提到的最佳解决方案是使用 scikit-learn 的 CountVectorizer。我在这里对您希望数据采用什么格式进行了一些假设,但这里会为您提供doc x token 数据框,其中值是文档中标记的计数。它假定df['col'] 是一个熊猫系列,其中值是列表。

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> cv = CountVectorizer(analyzer=lambda x: x)
>>> counted_values = cv.fit_transform(df['col']).toarray()
>>> df = pd.DataFrame(counted_values, columns=cv.get_feature_names())
>>> df.iloc[0:5, 0:5]
   .  action  after  and  be
0  1       1      1    0   0
1  0       0      0    1   0
2  0       0      0    0   1
3  0       0      0    0   1

CountVectorizer 可以为您标记化,并且默认情况下会,因此我们将一个标识 lambda 函数传递给 analyzer 参数,告诉它我们的文档已预先标记化。

次优答案

我不建议这样做,但如果您想了解 Counters 的工作原理,我认为它会有所帮助。由于您的值是一个列表,因此您可以在系列的每一行上使用 .apply

>>> counted_values = df['col'].apply(lambda x: Counter(x))
>>> counted_values
0    {'.': 1, 'after': 1, 'indicate': 1, 'action': ...
1    {'during': 1, 'and': 1, 'october': 1, 'please'...
2    {'will': 1, 'ongoing': 1, 'work': 1, 'the': 2,...
3    {'development': 1, 'professional': 1, 'session...
dtype: object

所以现在你有一系列的字典,这不是很有帮助。您可以将其转换为类似于我们上面的数据框,如下所示:

>>> suboptimal_df = pd.DataFrame(counted_values.tolist())
>>> suboptimal_df.iloc[0:5, 0:5]
     .  action  after  and   be
0  1.0     1.0    1.0  NaN  NaN
1  NaN     NaN    NaN  1.0  NaN
2  NaN     NaN    NaN  NaN  1.0
3  NaN     NaN    NaN  NaN  1.0

我不建议这样做,因为apply 很慢,而且我们将列表存储为系列值已经有点愚蠢了,字典同样愚蠢。 DataFrame 最好作为数字或字符串值的结构化容器(想想电子表格),而不是不同的容器类型。

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多