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

DataFrame迭代合并相邻词触发KeyError?含断词场景解决方案问询

问题:合并DataFrame中位置相邻的词汇条目

我有一个从文本提取词汇的DataFrame,包含词汇在文本中的位置列,示例如下:

word    start   end
sugar   10      16
ice     32      35
cream   36      41

我希望通过识别文本中相邻的词汇(即前一个词汇的end+1等于后一个词汇的start),将“ice cream”合并为单独条目,得到如下结果:

word      start   end
sugar     10      16
ice cream 32      41

我尝试了以下代码,但触发了KeyError:

treats = pd.DataFrame()

for i in range(len(df)):
  if df['end'][i]+1 == df['start'][i+1]:
    word = df['word'][i]+' '+df['word'][i+1]
    start = df['start'][i]
    end = df['end'][i+1]
    i = i+2
  else:
    word = df['word'][i]
    start = df['start'][i]
    end = df['end'][i]
  row = [site,url,ent,word,start,end]
  treats = pd.concat([treats,row])

请问我哪里出错了?


补充说明1:

感谢各位的优质解答!我发现数据中还存在被拆分的词汇,即df['end'][x] == df['start'][x+1],示例如下:

word    start   end
sugar   10      16
ice     32      35
cream   36      41
choc   120     124
olate  124     129 

请问是否有简便的解决方法?


错误分析

  1. 索引越界触发KeyError:当i循环到最后一行时,i+1超出DataFrame索引范围,访问df['start'][i+1]会直接报错。
  2. 手动修改循环变量无效:for循环的i由range(len(df))控制,手动设置i = i+2不会改变循环的迭代节奏,下一次循环仍会使用序列的下一个值。
  3. concat用法错误:row是列表,直接传入pd.concat会报错,需要先将列表转为DataFrame格式。
  4. 未定义变量:代码中的site, url, ent未给出定义,执行时会触发NameError。

解决方案(无需循环,向量化处理)

针对两种相邻场景(end+1 == start 和 end == start),可以通过标记分组的方式批量合并:

步骤1:创建分组标识

先判断当前行与上一行是否属于同一组,生成分组ID:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'word': ['sugar', 'ice', 'cream', 'choc', 'olate'],
    'start': [10, 32, 36, 120, 124],
    'end': [16, 35, 41, 124, 129]
})

# 同时匹配两种相邻情况
is_adjacent = (df['start'] == df['end'].shift() + 1) | (df['start'] == df['end'].shift())
# 生成分组ID:每遇到不相邻的行,分组ID+1
group_id = (~is_adjacent).cumsum()

步骤2:按分组聚合

# 聚合得到合并后的结果
result = df.groupby(group_id).agg(
    word=('word', ' '.join),
    start=('start', 'min'),
    end=('end', 'max')
).reset_index(drop=True)

print(result)

输出结果

word  start  end
0      sugar     10   16
1  ice cream     32   41
2  choc olate    120  129

额外说明

如果原始数据包含site, url, ent等其他列,只需在agg中添加对应列的聚合规则(比如取第一个值,因为同一组的这些列通常一致):

result = df.groupby(group_id).agg(
    site=('site', 'first'),
    url=('url', 'first'),
    ent=('ent', 'first'),
    word=('word', ' '.join),
    start=('start', 'min'),
    end=('end', 'max')
).reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:41