在 python 中使用 Counter() 函数
Using Counter() function in python
我有一个包含许多行和列的 excel 文件。我想做以下事情。首先,我想根据文本匹配过滤行。其次,我想选择一个特定的列并为该列中的所有单词生成词频。第三,我想绘制单词和频率图。
第一部分我已经弄明白了。我的问题是如何在数据帧上应用 Counter() 。如果我只使用 Counter(df),它 returns 是一个错误。因此,我使用以下代码将每一行转换为一个列表,然后应用 Counter。当我这样做时,我分别获得每一行的词频(如果我在 for 循环中使用计数器,否则我只获得一行的词频)。但是,我想要所有行的字数统计。感谢任何输入。谢谢!
以下是示例数据。
product review
a Great Product
a Delivery was fast
a Product received in good condition
a Fast delivery but useless product
b Dont recommend
b I love it
b Please dont buy
b Second purchase
我想要的输出是这样的:对于产品 a - (product,3),(delivery,2)(fast,2) etc..my current output is like (great,1), (product,1 ) 第一行。
这是我使用的代码。
strdata = column.values.tolist()
tokens = [tokenizer.tokenize(str(i)) for i in strdata]
cleaned_list = []
for m in tokens:
stopped = [i for i in m if str(i).lower() not in stop_words]
stemmed = [stemmer.stem(i) for i in stopped]
cleaned_list.append(stopped) #append stemmed words to list
count = Counter(stemmed)
print(count.most_common(10))
首先,使用 groupby 连接来自同一组的字符串。
其次,对连接的字符串应用 Counter()
。
joined = df.groupby('product', as_index=False).agg({'review' : ' '.join})
joined['count'] = joined.apply(lambda x: collections.Counter(x['review'].split(' ')), axis=1)
# print(joined)
product review count
0 a Great Product Delivery was fast Product receiv... {'Great': 1, 'Product': 2, 'Delivery': 1, 'was...
1 b Dont recommend I love it Please dont buy Secon... {'Dont': 1, 'recommend': 1, 'I': 1, 'love': 1,...
您可以使用以下功能。思路是
- 按
byvar
对数据进行分组。将 yvar
中的每个单词合并为一个列表。
- 应用
Counter
,如果需要,select 最常见的
- 分解得到一个长格式的数据框(之后更容易分析)
- 只保留相关列(
word
和 count
在新数据框中)
:
from collections import Counter
import pandas as pd
def count_words_by(data, yvar, byvar):
cw = pd.DataFrame({'counter' : data
.groupby(byvar)
.apply(lambda s: ' '.join(s[yvar]).split())
.apply(lambda s: Counter(s))
# .apply(lambda s: s.most_common(10)) #uncomment this line if you want the top 10 words
.explode()}
)
cw[['word','count']] = pd.DataFrame(cw['counter'].tolist(), index=cw.index)
cw_red = cw[['word','count']].reset_index()
return cw_red
count_words_by(data = df, yvar = "review", byvar = "product")
我假设你从那里开始:
product review
a Great Product
a Delivery was fast
a Product received in good condition
a Fast delivery but useless product
b Dont recommend
b I love it
b Please dont buy
b Second purchase
我有一个包含许多行和列的 excel 文件。我想做以下事情。首先,我想根据文本匹配过滤行。其次,我想选择一个特定的列并为该列中的所有单词生成词频。第三,我想绘制单词和频率图。
第一部分我已经弄明白了。我的问题是如何在数据帧上应用 Counter() 。如果我只使用 Counter(df),它 returns 是一个错误。因此,我使用以下代码将每一行转换为一个列表,然后应用 Counter。当我这样做时,我分别获得每一行的词频(如果我在 for 循环中使用计数器,否则我只获得一行的词频)。但是,我想要所有行的字数统计。感谢任何输入。谢谢! 以下是示例数据。
product review
a Great Product
a Delivery was fast
a Product received in good condition
a Fast delivery but useless product
b Dont recommend
b I love it
b Please dont buy
b Second purchase
我想要的输出是这样的:对于产品 a - (product,3),(delivery,2)(fast,2) etc..my current output is like (great,1), (product,1 ) 第一行。
这是我使用的代码。
strdata = column.values.tolist()
tokens = [tokenizer.tokenize(str(i)) for i in strdata]
cleaned_list = []
for m in tokens:
stopped = [i for i in m if str(i).lower() not in stop_words]
stemmed = [stemmer.stem(i) for i in stopped]
cleaned_list.append(stopped) #append stemmed words to list
count = Counter(stemmed)
print(count.most_common(10))
首先,使用 groupby 连接来自同一组的字符串。
其次,对连接的字符串应用 Counter()
。
joined = df.groupby('product', as_index=False).agg({'review' : ' '.join})
joined['count'] = joined.apply(lambda x: collections.Counter(x['review'].split(' ')), axis=1)
# print(joined)
product review count
0 a Great Product Delivery was fast Product receiv... {'Great': 1, 'Product': 2, 'Delivery': 1, 'was...
1 b Dont recommend I love it Please dont buy Secon... {'Dont': 1, 'recommend': 1, 'I': 1, 'love': 1,...
您可以使用以下功能。思路是
- 按
byvar
对数据进行分组。将yvar
中的每个单词合并为一个列表。 - 应用
Counter
,如果需要,select 最常见的 - 分解得到一个长格式的数据框(之后更容易分析)
- 只保留相关列(
word
和count
在新数据框中) :
from collections import Counter
import pandas as pd
def count_words_by(data, yvar, byvar):
cw = pd.DataFrame({'counter' : data
.groupby(byvar)
.apply(lambda s: ' '.join(s[yvar]).split())
.apply(lambda s: Counter(s))
# .apply(lambda s: s.most_common(10)) #uncomment this line if you want the top 10 words
.explode()}
)
cw[['word','count']] = pd.DataFrame(cw['counter'].tolist(), index=cw.index)
cw_red = cw[['word','count']].reset_index()
return cw_red
count_words_by(data = df, yvar = "review", byvar = "product")
我假设你从那里开始:
product review
a Great Product
a Delivery was fast
a Product received in good condition
a Fast delivery but useless product
b Dont recommend
b I love it
b Please dont buy
b Second purchase