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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:07:15