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
相关产品推荐
相关产品推荐

