Python:拆分DataFrame文本行为段落并保留文档ID
问题解决:拆分DataFrame中文档段落并保留原ID
错误原因分析
你的代码报错TypeError: string indices must be integers,核心问题是:dataframe.to_json(orient="records")返回的是JSON格式的字符串,而非可直接遍历的字典列表。当你for doc in docs时,实际是在逐个遍历字符串的字符,此时doc是单个字符,自然无法用doc["id"]这种字典索引方式。
推荐解决方案:Pandas原生方法(高效简洁)
利用Pandas的str.split和explode方法,几行代码就能完成拆分和展开,适合处理大数据量:
import pandas as pd # 原始数据 data={'id':['1','2','3'], 'doc':['Paragraph 1.\nParagraph 2.\nParagraph 3.', 'Paragraph 1.\nParagraph 2.', 'Paragraph 1.\nParagraph 2.\nParagraph 3.\nParagraph 4.']} df=pd.DataFrame(data) # 拆分段落并展开为每行一个段落 df['paragraph'] = df['doc'].str.split('\n') result_df = df.explode('paragraph').drop(columns=['doc']) # 输出结果 print(result_df)
输出结果:
id paragraph 0 1 Paragraph 1. 0 1 Paragraph 2. 0 1 Paragraph 3. 1 2 Paragraph 1. 1 2 Paragraph 2. 2 3 Paragraph 1. 2 3 Paragraph 2. 2 3 Paragraph 3. 2 3 Paragraph 4.
修正你的自定义函数
如果坚持用循环实现,只需将to_json替换为to_dict(orient="records"),同时调整段落拆分逻辑:
from typing import List import pandas as pd def split_into_paragraphs(dataframe): docs = dataframe.to_dict(orient="records") # 改用to_dict获取字典列表 paragraphs: List[str] = [] doc_indices: List[str] = [] for doc in docs: # 拆分当前文档的所有段落 paras = doc["doc"].split("\n") for para in paras: paragraphs.append(para.strip()) # 可选:去除段落前后空白 doc_indices.append(doc["id"]) # 返回DataFrame更便于后续处理,也可返回两个列表 return pd.DataFrame({"id": doc_indices, "paragraph": paragraphs}) # 测试函数 data={'id':['1','2','3'], 'doc':['Paragraph 1.\nParagraph 2.\nParagraph 3.', 'Paragraph 1.\nParagraph 2.', 'Paragraph 1.\nParagraph 2.\nParagraph 3.\nParagraph 4.']} df=pd.DataFrame(data) result = split_into_paragraphs(df) print(result)
额外注意事项
- 如果实际数据中存在空段落(比如连续换行),可以在拆分后过滤空字符串:
paras = [p.strip() for p in doc["doc"].split("\n") if p.strip()] - 无论ID是纯数字还是字符组合,两种方案都能正确保留原ID格式
内容的提问来源于stack exchange,提问作者feroli
相关产品推荐
相关产品推荐

