如何将列表中每个句子元素存入pandas列并避免Molecule列重复
问题原因
你当前的写法是将单个字符串的Molecule值和长度为N的句子列表sent_list直接传入pd.DataFrame构造函数,pandas会自动将长度不足的Molecule列重复填充到和句子列表相同的长度,最终得到N行数据,不符合一行对应一个分子的预期。
解决方案
你需要提前把单个分子对应的四个字段值计算完成,再构造DataFrame,如果需要处理多个分子,可先把所有分子的字段值存为字典列表后再统一转DataFrame。
单次查询单个分子的修改后代码
import spacy import pandas as pd import wikipediaapi # 模型加载放外面,避免每次查询重复加载浪费资源 nlp = spacy.load('en_core_web_sm') wiki_wiki = wikipediaapi.Wikipedia('en') chemical = input("Write the name of molecule: ") page_py = wiki_wiki.page(chemical) summary = page_py.summary # 拆分句子 doc = nlp(summary) sent_list = [sent.text.strip() for sent in doc.sents] # 提前计算各列对应值 data = { "Molecule": chemical, "Sentence1": sent_list[0] if len(sent_list)>=1 else "", "Sentence1 and sentence2": " ".join(sent_list[:2]) if len(sent_list)>=2 else " ".join(sent_list), "All_sentence": summary } # 构造DataFrame时外层加[],标识这是一行数据,不会自动拆分补全 df = pd.DataFrame([data]) print(df)
批量处理多个分子的版本
如果需要把多个分子的结果整合到同一个DataFrame里,可以用如下写法:
import spacy import pandas as pd import wikipediaapi nlp = spacy.load('en_core_web_sm') wiki_wiki = wikipediaapi.Wikipedia('en') # 要查询的分子列表可自行修改 chemical_list = ["MgO", "CaO", "NaCl"] all_data = [] for chemical in chemical_list: page_py = wiki_wiki.page(chemical) summary = page_py.summary doc = nlp(summary) sent_list = [sent.text.strip() for sent in doc.sents] all_data.append({ "Molecule": chemical, "Sentence1": sent_list[0] if len(sent_list)>=1 else "", "Sentence1 and sentence2": " ".join(sent_list[:2]) if len(sent_list)>=2 else " ".join(sent_list), "All_sentence": summary }) df = pd.DataFrame(all_data) print(df)
关键改动说明
- 构造DataFrame时给字段字典外层加
[],明确告诉pandas这是一行数据的所有字段值,不会触发自动补全逻辑 - 提前计算你需要的四个自定义列的取值,不需要单独存储每个句子的列
- 增加了列表长度判断,避免分子摘要过短、句子不足2个时出现索引报错
- 把spacy模型加载、维基接口初始化放到循环外,大幅提升批量处理的效率
内容的提问来源于stack exchange,提问作者Zia
相关产品推荐
相关产品推荐

