如何在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
相关产品推荐
相关产品推荐

