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

使用for循环遍历pandas DataFrame生成实体标注数据问题求解

问题描述

我是Python新手,目前使用for循环迭代读取CSV文件,CSV文件结构见上传的截图。
我的标注需求如下:

  • 针对句子「Launch Flipkart https://www.flipkart.com」,提取(0,6)位置的实体Launch
  • 针对句子「Enter Email xyz@gmail.com」,提取(0,5)位置的实体Enter
    我目前使用的代码如下:
df=pd.read_csv("File_name.csv")
l1=[]
l2=[]
for i in range(0,len(df['SENTENCE'])):
    l1.append(df['SENTENCE'][i])
    l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Operation'][i])]})
    l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Argument'][i])]})

TRAIN_DATA=list(zip(l1,l2))
TRAIN_DATA

我在第6行代码遇到了问题:

l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Operation'][i])]})

我知道应该将df['SENTENCE'][i]替换为变量,但不知道如何定义该变量才能得到最优结果。

解决方案

你当前的问题除了变量定义之外,还有两个逻辑问题:一是用整个句子的长度作为实体结束下标,不符合你提取句首第一个词的需求;二是重复给同一句子追加两个实体字典,不符合常规NER训练数据的格式要求(单句对应一个实体列表,所有实体放在同一列表内)。
优化后的代码如下:

import pandas as pd

df = pd.read_csv("File_name.csv")
TRAIN_DATA = []

# 用iterrows遍历DataFrame行,比按索引取值更稳妥
for _, row in df.iterrows():
    # 定义sentence变量替换df['SENTENCE'][i],存储当前行的句子内容
    sentence = row['SENTENCE']
    # 自动计算句首第一个词的结束下标:取第一个空格的位置,无空格则取整个句子长度
    first_word_end = sentence.find(' ') if ' ' in sentence else len(sentence)
    # 组装实体列表
    entities = []
    # 标注Operation实体(你需求里的Launch、Enter都属于这类)
    if pd.notna(row['Operation']):
        entities.append((0, first_word_end, row['Operation']))
    # 如果需要标注Argument实体,补充对应下标逻辑后放开下面的注释即可
    # if pd.notna(row['Argument']):
    #     entities.append((start_idx, end_idx, row['Argument']))
    # 组装为训练数据加入列表
    TRAIN_DATA.append((sentence, {"entities": entities}))

print(TRAIN_DATA)
代码说明
  • 定义的sentence变量就是你需要的替换df['SENTENCE'][i]的变量,后续所有需要用到当前句子内容的地方直接调用该变量即可,无需重复访问DataFrame取值,代码可读性和运行效率都更高
  • first_word_end会自动适配不同长度的句首词,不用手动写死下标数值,适配性更强
  • 单条训练数据对应一个句子+所有实体的结构,符合spaCy等主流NLP框架的训练数据格式要求

内容的提问来源于stack exchange,提问作者user16974519

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:06:02