Python pandas的lambda函数中是否可以使用OR逻辑运算符?
问题解答
你编写的第二种写法不可行,存在逻辑判断错误,具体原因和正确实现方案如下:
错误原因
Python中逻辑运算符or的运算优先级低于in,且非空字符串的布尔值恒为True,你写的判断条件实际等价于:
if ('Issue:') or ("Root Cause:" in x):
因为'Issue:'永远为真,所以整个条件会永远成立,所有行的notes都会保留原值,不会触发NO_ISSUE的赋值逻辑,完全不符合需求。
正确实现方案
方案1:修正lambda条件写法(适合少量匹配规则)
把每个匹配规则都单独写完整的in判断即可,示例如下:
df['notes'] = df['notes'].apply(lambda x: x if 'Issue:' in x or 'Root Cause:' in x else "NO_ISSUE")
如果后续需要新增更多匹配关键词,继续用or拼接新关键词 in x格式的判断即可。
方案2:使用pandas向量化方法(更推荐,性能更高)
apply本质是逐行遍历,大数据集下性能很差,推荐使用pandas内置的str.contains方法结合where实现多条件匹配,多关键词直接用正则符号|分隔即可,写法更简洁,性能也远高于apply:
df['notes'] = df['notes'].where(df['notes'].str.contains(r'Issue:|Root Cause:'), 'NO_ISSUE')
如果列中存在空值需要避免报错,可以新增na=False参数:
df['notes'] = df['notes'].where(df['notes'].str.contains(r'Issue:|Root Cause:', na=False), 'NO_ISSUE')
内容的提问来源于stack exchange,提问作者3awny
相关产品推荐
相关产品推荐

