如何将DataFrame提取的命名实体存入列表?TypeError报错求解
问题排查与解决方案
看起来你遇到的问题根源很明确:你的df['Article']列里存在缺失值(NaN),而NaN在pandas中是以float类型存储的。当spaCy的nlp()函数尝试处理这个float类型的对象时,就会触发TypeError: object of type 'float' has no len()错误——因为spaCy只接受字符串输入,它会尝试计算输入文本的长度,而float类型没有len()方法。
你之前的打印代码可能刚好没遍历到包含NaN的行,或者测试时用的是没有缺失值的子集,所以没触发错误;但当你尝试批量收集实体时,循环必然会碰到这些空值行,导致报错。
解决方案步骤
1. 清理数据后收集实体(仅保留非空文章)
如果你只需要提取所有非空文章的实体,不需要保留空行的对应关系,可以先过滤掉Article列的NaN值,再循环处理:
entities_list = [] # 过滤空值并确保输入是字符串类型 for article in df['Article'].dropna().astype(str): doc = nlp(article) # 将当前文章的所有实体存入子列表,再添加到总列表 current_entities = [entity.text for entity in doc.ents] entities_list.append(current_entities)
这样得到的entities_list就是你想要的[[entity1, entity2], [entity3, entity4], ...]格式,每个子列表对应一篇文章的实体。
2. 保留原DataFrame行对应关系(含空行)
如果你需要给原DataFrame添加一列,存储每行对应的实体列表(空行对应空列表),可以用apply()方法,同时处理空值情况:
import pandas as pd def extract_entities(text): # 处理空值或非字符串的异常情况 if pd.isna(text) or not isinstance(text, str): return [] doc = nlp(text) return [entity.text for entity in doc.ents] # 添加新列存储每行的实体列表 df['Entities'] = df['Article'].apply(extract_entities) # 如果需要把所有实体提取成一个扁平列表: all_entities_flat = [ent for sublist in df['Entities'] for ent in sublist]
3. 验证数据中的空值
你可以先运行下面的代码,确认Article列的空值数量,进一步验证问题根源:
print(df['Article'].isna().sum())
内容的提问来源于stack exchange,提问作者Raza Ul Haq
相关产品推荐
相关产品推荐

