遍历列并创建多个数据框

金S。

我有多个文本列。我想为每个文本列使用词袋,然后为每个文本列创建一个新的词袋数据框。这就是我所拥有的:

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 条目answer1answer2.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章