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
请问是否有简便的解决方法?
错误分析
- 索引越界触发KeyError:当
i循环到最后一行时,i+1超出DataFrame索引范围,访问df['start'][i+1]会直接报错。 - 手动修改循环变量无效:
for循环的i由range(len(df))控制,手动设置i = i+2不会改变循环的迭代节奏,下一次循环仍会使用序列的下一个值。 - concat用法错误:
row是列表,直接传入pd.concat会报错,需要先将列表转为DataFrame格式。 - 未定义变量:代码中的
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
相关产品推荐
相关产品推荐

