如何基于含起止索引列表的列生成新的DataFrame?
问题描述
现有如下DataFrame,其中Labels列是包含文本起止索引及对应标签的嵌套列表,结构示例如下:
| No | Text | Labels |
|---|---|---|
| 1 | Apples are the best. Banana is cool | [[0, 6, Apple],[21, 27, Banana]] |
| 2 | Random text. | [[0, 2, Stuff],[3,4,Stuff2]] |
需要基于Labels列生成新的DataFrame,将文本中的标注片段和未标注片段拆分为单独行,标注片段对应原标签,未标注片段标签设为None,最终输出示例如下:
| No | Text | Label |
|---|---|---|
| 1 | Apples | Apple |
| 2 | are the best. | None |
| 3 | Banana | Banana |
| 4 | is cool | None |
| 5 | Ra | Stuff |
| 6 | n | Stuff2 |
| 7 | dom text. | None |
解决方案
通过遍历原DataFrame的每一行,按标签索引拆分文本片段并整理成新数据集,以下是Python实现代码:
import pandas as pd # 构造原始DataFrame data = { "No": [1, 2], "Text": ["Apples are the best. Banana is cool", "Random text."], "Labels": [[[0, 6, "Apple"], [21, 27, "Banana"]], [[0, 2, "Stuff"], [3, 4, "Stuff2"]]] } df = pd.DataFrame(data) # 存储拆分后的结果 result_rows = [] new_no = 1 for _, row in df.iterrows(): text = row["Text"] # 按起始索引排序标签,避免顺序混乱 sorted_labels = sorted(row["Labels"], key=lambda x: x[0]) prev_end = 0 # 处理每个标注片段 for start, end, label in sorted_labels: # 提取标注前的未标注文本 if start > prev_end: result_rows.append({ "No": new_no, "Text": text[prev_end:start].strip(), "Label": None }) new_no += 1 # 提取标注文本 result_rows.append({ "No": new_no, "Text": text[start:end], "Label": label }) new_no += 1 prev_end = end # 处理最后一段未标注文本 if prev_end < len(text): result_rows.append({ "No": new_no, "Text": text[prev_end:].strip(), "Label": None }) new_no += 1 # 生成目标DataFrame new_df = pd.DataFrame(result_rows) print(new_df)
代码说明
- 先对每行标签按起始索引排序,确保拆分顺序正确
- 遍历标签时,优先提取当前标注片段之前的未标注文本
- 再提取标注片段本身
- 最后处理所有标注完成后剩余的未标注文本
- 若需保留原文本的空格格式,可删除
strip()方法
内容的提问来源于stack exchange,提问作者stephsmith
相关产品推荐
相关产品推荐

