You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含起止索引列表的列生成新的DataFrame?

问题描述

现有如下DataFrame,其中Labels列是包含文本起止索引及对应标签的嵌套列表,结构示例如下:

NoTextLabels
1Apples are the best. Banana is cool[[0, 6, Apple],[21, 27, Banana]]
2Random text.[[0, 2, Stuff],[3,4,Stuff2]]

需要基于Labels列生成新的DataFrame,将文本中的标注片段和未标注片段拆分为单独行,标注片段对应原标签,未标注片段标签设为None,最终输出示例如下:

NoTextLabel
1ApplesApple
2are the best.None
3BananaBanana
4is coolNone
5RaStuff
6nStuff2
7dom 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:22:12