Pandas 列表中的词频
Word frequencies in Pandas list
我在 pandas df 中有一列标记化、词形还原的文本。我正在尝试创建一个词频矩阵,以便我可以继续进行降维。
我一直 运行ning 出错,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]
简单回答
鉴于您告诉我们的内容,9dogs 提到的最佳解决方案是使用 scikit-learn 的 CountVectorizer
。我在这里对您希望数据采用哪种格式做出一些假设,但这里将为您提供一个 doc x token
数据框,其中的值是文档中标记的计数。它假定 df['col']
是一个 pandas 系列,其中值是列表。
>>> 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
参数,告诉它我们的文档已预先标记化。
次优答案
我不推荐这个,但如果您想了解计数器的工作原理,我认为它会很有帮助。由于您的值是一个列表,因此您可以在系列的每一行上使用 .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
很慢,而且我们将列表存储为 Series 值已经有点愚蠢了,dicts 也同样愚蠢。 DataFrames 最适合作为数字或字符串值的结构化容器(想想电子表格),而不是不同的容器类型。
我在 pandas df 中有一列标记化、词形还原的文本。我正在尝试创建一个词频矩阵,以便我可以继续进行降维。
我一直 运行ning 出错,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]
简单回答
鉴于您告诉我们的内容,9dogs 提到的最佳解决方案是使用 scikit-learn 的 CountVectorizer
。我在这里对您希望数据采用哪种格式做出一些假设,但这里将为您提供一个 doc x token
数据框,其中的值是文档中标记的计数。它假定 df['col']
是一个 pandas 系列,其中值是列表。
>>> 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
参数,告诉它我们的文档已预先标记化。
次优答案
我不推荐这个,但如果您想了解计数器的工作原理,我认为它会很有帮助。由于您的值是一个列表,因此您可以在系列的每一行上使用 .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
很慢,而且我们将列表存储为 Series 值已经有点愚蠢了,dicts 也同样愚蠢。 DataFrames 最适合作为数字或字符串值的结构化容器(想想电子表格),而不是不同的容器类型。