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

Python处理DataFrame拼接多列计算字符串偏移生成标注数据

问题原因

你当前的代码通过rpartition、rfind定位最后一个空格的逻辑,仅能适配2列拼接的场景,没法识别多列拼接后的不同分隔位置,自然无法正确计算第3列及后续列的偏移。

通用实现方案

核心思路是提前定义「值列-对应标签列」的配对顺序,逐行遍历的时候按顺序拼接列值,同时累加计算每段内容的偏移,后续新增列只需修改配对列表即可,无需调整处理逻辑。

完整代码

import pandas as pd

# 构造测试DataFrame
df = pd.DataFrame({
    'house': {0: 'House 263', 1: 'House 31', 2: 'House 193/A'}, 
    'label1': {0: 'holding_number', 1: 'holding_number', 2: 'holding_number'}, 
    'district': {0: 'dhaka', 1: 'comilla', 2: 'chittagong'}, 
    'label2': {0: 'district', 1: 'district', 2: 'district'}, 
    'area': {0: 'mirpur', 1: 'badda', 2: 'dohs'}, 
    'label3': {0: 'area', 1: 'area', 2: 'area'}
})

# 定义值列和对应标签列的配对顺序,后续新增列直接往该列表添加元组即可
col_pairs = [
    ('house', 'label1'),
    ('district', 'label2'),
    ('area', 'label3')
]

TRAIN_DATA = []
for _, row in df.iterrows():
    full_text = ""
    entities = []
    current_offset = 0
    for val_col, label_col in col_pairs:
        content = str(row[val_col])
        label = row[label_col]
        # 计算当前内容的起止偏移,默认左闭右开(符合spaCy等NLP工具的偏移规则)
        start = current_offset
        end = start + len(content)
        # 如果你需要左闭右闭的偏移,把上面end改为 start + len(content) - 1 即可
        entities.append([(start, end), label])
        # 拼接内容,更新偏移(+1是因为两段内容之间有空格分隔)
        full_text += content + " "
        current_offset = end + 1
    # 去掉末尾多余的空格
    full_text = full_text.strip()
    TRAIN_DATA.append((full_text, {"entities": entities}))

print(TRAIN_DATA)

输出说明

运行后第一行输出为:

('House 263 dhaka mirpur', {'entities': [[(0, 9), 'holding_number'], [(10, 15), 'district'], [(16, 22), 'area']]})

你示例里的预期输出少拼接了mirpur属于笔误,偏移数值差异是因为默认按NLP领域常用的左闭右开规则计算,如果你需要左闭右闭,按代码注释调整end的计算逻辑即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:57:05