如何在Pandas中基于布尔列值对指定行的列应用函数?
解决方法
你的代码问题在于lambda里引用了整个df["spelling"]列,而不是当前行的布尔值,导致条件判断逻辑错误。同时全量apply确实会浪费资源,下面是两种高效的解决方案,只处理spelling为False的行:
方案1:使用loc定位目标行(推荐)
先把new_name初始化为name的副本,再仅对需要修正的行应用函数:
import difflib import pandas as pd # 初始化新列为原name列的拷贝 df["new_name"] = df["name"].copy() # 生成需要修正的行的掩码 mask = df["spelling"] == False # 仅对掩码匹配的行应用拼写修正逻辑 df.loc[mask, "new_name"] = df.loc[mask, "name"].apply( lambda x: difflib.get_close_matches(x, correction)[0] if difflib.get_close_matches(x, correction) else x )
注意:加入了if difflib.get_close_matches(x, correction)的判断,避免当没有匹配结果时触发索引越界错误。
方案2:使用numpy.where简化代码
用numpy的条件判断函数一次性完成赋值,逻辑更紧凑:
import difflib import pandas as pd import numpy as np df["new_name"] = np.where( df["spelling"], # 条件:spelling为True时 df["name"], # 直接保留原name # spelling为False时应用修正函数 df["name"].apply(lambda x: difflib.get_close_matches(x, correction)[0] if difflib.get_close_matches(x, correction) else x) )
大数据量额外优化
如果correction列表非常大,difflib.get_close_matches的效率可能不足,可以考虑使用更高效的字符串匹配库(比如fuzzywuzzy的process.extractOne),或者将correction预处理为合适的数据结构(比如倒排索引)来加速匹配。
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

