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

如何在Pandas DataFrame中按行生成匹配的国家提取列(含NA填充)

我来帮你解决这个问题!你现在的核心困扰是:提取到的国家列表只包含有匹配结果的行,没法和原DataFrame的每行一一对应——这是因为你没有为那些没有国家的行保留占位符。咱们可以通过自定义单行处理函数+Pandas的apply方法完美解决这个问题。

问题原因分析

你原来的循环只把找到的国家追加到列表里,完全跳过了没有匹配到国家的行,导致countries列表的长度和原DataFrame的行数不一致,自然没法直接对应赋值。

解决方案代码

我们可以写一个专门处理单条文本的函数,让它对每行文本返回对应的国家(或NA),再用apply把函数映射到整个文本列:

import pandas as pd
import spacy

# 加载Spacy模型
nlp = spacy.load("en_core_web_sm")

# 初始化数据
data = [[10, 'I went to Mexico'], [20, 'He ate a sandwich'], [30, 'I went to Canada']]
df = pd.DataFrame(data, columns=['Numbers', 'Text'])
df['Text'] = df['Text'].astype(str).str.lower()

# 定义提取国家的函数:匹配GPE类型实体(国家/地区属于这个类别)
def extract_nation(text):
    doc = nlp(text)
    # 遍历实体,返回第一个匹配到的国家
    for ent in doc.ents:
        if ent.label_ == 'GPE':
            return ent.text
    # 没有匹配到则返回'NA'
    return 'NA'

# 生成Nation列
df['Nation'] = df['Text'].apply(extract_nation)

# 查看结果
print(df)

运行结果

输出的DataFrame完全符合你的预期:

Numbers                  Text  Nation
0       10    i went to mexico  mexico
1       20   he ate a sandwich      NA
2       30    i went to canada  canada

扩展:处理多行多国家的情况

如果你的文本里存在多个国家(比如'I visited Mexico and Canada'),可以修改函数返回所有匹配到的国家,用逗号分隔:

def extract_nation(text):
    doc = nlp(text)
    # 收集所有匹配的国家
    nations = [ent.text for ent in doc.ents if ent.label_ == 'GPE']
    # 有结果就用逗号连接,没有就返回'NA'
    return ', '.join(nations) if nations else 'NA'

内容的提问来源于stack exchange,提问作者Sean Burns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:35:27