我正在尝试这样计算pandas DataFrame中关键字的数量:
df = pd.read_csv('amazon_baby.csv')
selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate']
selected_words必须从系列中计数:df ['review']
我尝试过
def word_counter(sent):
a={}
for word in selected_words:
a[word] = sent.count(word)
return a
然后
df['totalwords'] = df.review.str.split()
df['word_count'] = df.totalwords.apply(word_counter)
----------------------------------------------------------------------------
----> 1 df['word_count'] = df.totalwords.apply(word_counter)
c:\users\admin\appdata\local\programs\python\python36\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
3192 else:
3193 values = self.astype(object).values
-> 3194 mapped = lib.map_infer(values, f, convert=convert_dtype)
3195
3196 if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()
<ipython-input-51-cd11c5eb1f40> in word_counter(sent)
2 a={}
3 for word in selected_words:
----> 4 a[word] = sent.count(word)
5 return a
AttributeError: 'float' object has no attribute 'count'
有人可以帮助..吗? 我猜这是因为该系列中的某些故障值不是字符串。 。
有人尝试提供帮助,但问题是DataFrame中的单个单元格中包含句子。
我需要提取选定单词的数量,最好是字典形式,并将它们存储在具有相应行的同一dataFrame中的新列中。
答案 0 :(得分:5)
假设您的数据框看起来像这样,
df=pd.DataFrame({'A': ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate','great', 'fantastic', 'amazing', 'love', 'horrible']})
print(df)
A
0 awesome
1 great
2 fantastic
3 amazing
4 love
5 horrible
6 bad
7 terrible
8 awful
9 wow
10 hate
11 great
12 fantastic
13 amazing
14 love
15 horrible
selected_words=['awesome','great','fantastic']
df.loc[df['A'].isin(selected_words),'A'].value_counts()
[out]
great 2
fantastic 2
awesome 1
Name: A, dtype: int64
答案 1 :(得分:0)
使用list.count
的值在循环中重复list
可以工作,尽管效率很低。复杂度为O( m x n ),其中 m 是所选值的数量, n 是值的总数。
使用Pandas,您可以使用优化的方法来确保O( n )的复杂性。在这种情况下,您可以使用value_counts
,然后使用reindex
:
res = df['A'].value_counts().reindex(selected_words)
print(res)
awesome 1
great 2
fantastic 2
Name: A, dtype: int64
或者,根据@pyd's solution,先过滤,然后再使用value_counts
。这两种解决方案都将具有O( n )复杂度。
答案 2 :(得分:0)
在您的问题中,您似乎正在实施一项计数法。 @pyd发布了一个很好的计数解决方案。产生的结果不是命令。如果您正在寻找字典作为输出,请查看下面发布的这段代码,它基本上是pyd提供的解决方案的扩展。
df=pd.DataFrame({'A': ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate','great', 'fantastic', 'amazing', 'love', 'horrible']})
def get_count_dict(data, selected_words):
count_dict = {}
counts = data.loc[data['A'].isin(selected_words), 'A'].value_counts()
for i in range(len(counts.index.tolist())):
count_dict[counts.index.tolist()[i]] = counts[i]
return count_dict
selected_words=['awesome','great','fantastic']
get_count_dict(df, selected_words)
Output : {'fantastic': 2, 'great': 2, 'awesome': 1}