pandas dataframe如何用lambda判断clean_text列污词生成result列
修正后的Lambda实现方案
前置性能优化
3000个元素的corpus为列表结构时,每次执行w in corpus判断需要线性遍历整个列表,查找效率很低。先将其转换为集合结构,把单元素查找的时间复杂度从O(n)降至O(1),大幅提升运行速度:
corpus_set = set(corpus)
核心Lambda代码
你之前写的Lambda逻辑存在两个根本问题:
- 用列表推导式遍历每个分词生成对应值,最终返回的是多值组成的列表,而非单值判断结果,才会出现单元格里存一堆
Relevant的错误结构 - 没有实现“任意分词命中污词就标记为Irrelevant”的整体判断逻辑,缺失对应的分支返回规则
用Python内置的any()函数实现“任意命中即触发标记”的逻辑,配合三元表达式补全两个分支的单值返回:
df['result'] = df['clean_text'].apply( lambda x: "Irrelevant" if any(word in corpus_set for word in x) else "Relevant" )
运行逻辑说明
any()逐一遍历当前行的分词列表,只要碰到第一个存在于corpus_set的污词,就立刻停止遍历返回True,不会做无意义的全量遍历- 最终每个单元格返回的是单个字符串值,完全匹配预期的列结构:无污词返回
Relevant,存在任意污词返回Irrelevant
关于之前双重循环的问题
你写的双重for循环除了运行速度慢,本身存在逻辑硬伤:代码中df['result'] = "Irrelevant"是给整列所有行统一赋值,而非给当前遍历定位的第i行单独赋值,就算解决了速度问题,最终输出的结果也是错误的。同时因为全程没有做集合转换加速,加上逐行逐词的Python层循环,数据量越大运行效率越低。
内容的提问来源于stack exchange,提问作者d_b
相关产品推荐
相关产品推荐

