python - 遍历列并创建多个数据框
问题描述
我有多个文本列。我想为每个文本列使用词袋,然后为每个文本列创建一个新的词袋数据框。这就是我所拥有的:
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 的单词。
任何想法如何解决这一问题?
解决方案
请正确跟踪您的代码。您确实得到了两个数据帧,但您丢弃了除最后一个之外的所有数据帧。您需要将它们全部保存(两者):
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
.
推荐阅读
- r - 将每个变量观察的多行“转换”为 R 中的单列
- html - 在 for 循环中选择 mat-select,在下拉列表中设置“选定” - 角度
- assembly - 使用 BIOS int 13h 访问不同磁头中的扇区
- excel - SAP GUI 脚本:读取表格控件中的单元格值
- c# - 当您尝试将值设置为只读属性时会发生什么?
- javascript - Gatsby - Javascript 从 API 响应中替换图像 src
- python - 鼠标单击后将文本添加到 matplotlib 图
- angular - 在订阅中返回布尔值的替代方法
- sql - sql中的2列在另一列之下
- javascript - 有没有办法从 json 中获取一个值作为 react native 中的变量