求助:标注数据同字符串多Span合并及目标格式DataFrame生成
解决标注数据的DataFrame合并与格式化问题
问题核心
处理标注人员对同一字符串位置的Span标注差异(如"Hello"与"Hello,"被识别为不同条目),需按start值合并相似Span(保留首个文本),新增string_num列存储start值,生成目标格式的DataFrame。
数据与示例
初始数据片段
data = [ {"text": "Hello", "start": 0, "label1": "Greeting", "label2": "", "label3": "Greeting"}, {"text": "Hello,", "start": 0, "label1": "", "label2": "Greeting", "label3": ""}, {"text": "World", "start": 6, "label1": "Entity", "label2": "Entity", "label3": ""} ]
当前错误输出
| text | start | label1 | label2 | label3 |
|---|---|---|---|---|
| Hello | 0 | Greeting | Greeting | |
| Hello, | 0 | Greeting | ||
| World | 6 | Entity | Entity |
期望输出
| text | string_num | label1 | label2 | label3 |
|---|---|---|---|---|
| Hello | 0 | Greeting | Greeting | Greeting |
| World | 6 | Entity | Entity |
修正后的代码
import pandas as pd # 标注数据 data = [ {"text": "Hello", "start": 0, "label1": "Greeting", "label2": "", "label3": "Greeting"}, {"text": "Hello,", "start": 0, "label1": "", "label2": "Greeting", "label3": ""}, {"text": "World", "start": 6, "label1": "Entity", "label2": "Entity", "label3": ""} ] df = pd.DataFrame(data) # 定义分组处理逻辑 def merge_span(group): # 保留组内第一个文本 merged_text = group["text"].iloc[0] # 提取所有label列 label_columns = [col for col in group.columns if col.startswith("label")] # 处理每个label列,取首个非空值 label_results = {} for col in label_columns: non_empty_vals = group[col][group[col] != ""].dropna() label_results[col] = non_empty_vals.iloc[0] if not non_empty_vals.empty else "" # 构造结果行 return pd.Series({ "text": merged_text, "string_num": group["start"].iloc[0], **label_results }) # 按start分组并应用合并逻辑 final_df = df.groupby("start", as_index=False).apply(merge_span).reset_index(drop=True) # 输出结果 print(final_df)
代码说明
- 分组逻辑:通过
groupby("start")将同一位置的Span归为一组,确保同一字符串位置的标注被合并 - 文本保留:每组取第一个
text值作为合并后的展示文本,解决Span差异问题 - Label合并:对每个label列,提取组内首个非空标注值,空值则保留空字符串,完整保留所有标注人员的有效结果
- 新增列:将
start值存入string_num列,满足格式需求
内容的提问来源于stack exchange,提问作者Bohdan Hlinski
相关产品推荐
相关产品推荐

