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

如何用enchant库提取Pandas DataFrame非英文单词并解决ValueError报错

你触发ValueError的核心原因是直接将pandas整列(Series对象)传入了设计用来处理单个字符串的校验函数,函数内部对Series执行布尔判断、调用str.split这类专属方法时,就会触发真值歧义的错误。另外原函数逻辑还存在两个可优化的问题:

  • 单个单词校验和整行单词拆分的逻辑混淆,没有逐词判断
  • 每次调用函数都重复创建enchant字典实例,20万行的量级下会严重拖慢运行速度

修正后的完整代码如下:

import pandas as pd
import enchant
import re

# 提前创建所有英文词典实例,避免重复初始化提升性能
en_ls = ['en_NZ', 'en_US', 'en_AU', 'en_GB']
en_dicts = [enchant.Dict(lang) for lang in en_ls]

# 初始化测试数据集
df = pd.DataFrame({'dundee':    ["I love:Marae", "My Whanau is everything",  "I lov Matauranga", "Tāmaki Makaurau is Whare", "AOD problem is common"]})
# 预处理:移除标点、转小写,新增regex=True适配新版pandas规范
df['dundee1'] = df['dundee'].str.replace(r'[^\w\s]+', ' ', regex=True)
df['dundee1'] = df['dundee1'].str.lower()

# 校验单个单词是否为英文的工具函数
def is_english(word):
    if not word.strip():
        return True
    for dic in en_dicts:
        if dic.check(word):
            return True
    return False

# 处理单行文本,返回所有非英文单词拼接结果
def extract_non_eng(text):
    words = text.split()
    non_eng_words = [word for word in words if not is_english(word)]
    return ', '.join(non_eng_words)

# 逐行应用函数生成新列
df['non_english'] = df['dundee1'].apply(extract_non_eng)

运行后输出结果和预期一致:

dundeenon_english
0I love:Maraemarae
1My Whanau is everythingwhanau
2I lov Mataurangalov, matauranga
3Tāmaki Makaurau is Wharetāmaki, makaurau, whare
4AOD problem is commonaod

如果需要保留非英文单词的原始大小写,仅需调整逻辑:从原始dundee列拆分单词,将单词转小写后校验,匹配到非英文词时保留原始大小写输出即可。

内容的提问来源于stack exchange,提问作者Bible Stands

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:42:02