首页 > 解决方案 > 遍历列并创建多个数据框

问题描述

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

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”的数据框,其中只有一袋用于 answer2 的单词。

任何想法如何解决这一问题?

标签: pythonpandasdataframeloopstext

解决方案


请正确跟踪您的代码。您确实得到了两个数据帧,但您丢弃了除最后一个之外的所有数据帧。您需要将它们全部保存(两者):

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.


推荐阅读