我有多个文本列。我想为每个文本列使用词袋,然后为每个文本列创建一个新的词袋数据框。这就是我所拥有的:
text_df = [['text response', 'another response'], ['written responses', 'more text'], ['lots more text', 'text text']]
text_df = pd.DataFrame(text_df, columns = ['answer1', 'answer2'])
def bow (tokens, data):
tokens = tokens.apply(nltk.word_tokenize)
cvec = CountVectorizer(min_df=.01, ngram_range=(1,3), tokenizer=lambda doc:doc, lowercase=False)
cvec.fit(tokens)
cvec_counts = cvec.transform(tokens)
cvec_counts_bow = cvec_counts.toarray()
vocab = cvec.get_feature_names()
bow_model = pd.DataFrame(cvec_counts_bow, columns=vocab)
return bow_model
answers = ['answer1', 'answer2']
for a in answer_list:
a = bow(text_df[a], a)
我想要 2 个数据帧,一个叫做 answer1,一个叫做 answer2,每个都有自己的词袋。但是,我最终得到了一个名为“a”的数据框,其中只有答案 2 的单词包。
任何想法如何解决这个问题?
请正确跟踪您的代码。您确实获得了两个数据帧,但您丢弃了除最后一个之外的所有数据帧。您需要将它们全部保存(两者):
frame_list = [bow(text_df[a], a) for a in answer_list]
另外,请注意您使用了一种非常危险的做法:您在循环内a
用不同的值覆盖了循环索引。
如果确实需要循环格式,请使用不同的变量并保存结果:
frame_list = []
for answer in answer_list:
frame_list.append(bow(text_df[answer], answer))
在这里,我使用answer
遍历列表,但我更改的变量是frame_list
.
更新每个 OP 评论:
请参见如何创建可变变量。当您期望您的程序动态修改其名称空间时,您就创建了一个危险的功能——通常没有设计目的的功能。相反,要么创建一个数据列表(就像我在我的解决方案中所做的那样),或者——如果你生成的名称在外部确实有一些意义——正确地将这些标签视为数据......使用字典:
frame_table = {}
for idx, answer in enumerate(answer_list):
frame_table["answer" + str(idx+1)] = (bow(text_df[answer], answer))
这将为您提供两个 dict 条目answer1
和answer2
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句