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

请求解析pandas df.str.contains()过滤时移除空值的行为

Pandas筛选不含指定字符串行时,空值行被误删的原因与解决方案解析

问题场景

想要筛选DataFrame中某列不包含指定字符串列表的行,初始代码如下:

searchfor = ['VIP', 'Employee', 'Replacement', 'Complimentary', 'Complementary']
df = df[~df['Discount Code'].str.contains('|'.join(searchfor))]

运行后发现,除了包含目标字符串的行被移除,该列为空值(null)的行也被一并删掉了。添加na=False参数后问题解决,可行代码:

df = df[~df['Discount Code'].str.contains('|'.join(searchfor), case=False, na=False)]

示例数据:

id  discount_code
83  C-72772 <NA>
89  C-72767 <NA>
90  C-72766 <NA>
93  C-72763 Employee Order
98  C-72759 VIP Order

原代码误删空值行的原因

pandas的str.contains()方法处理空值(NaN/NA)时,默认返回NaN而非布尔值True或False。

在布尔索引筛选时,pandas会将NaN判定为无效条件,直接过滤掉对应行。原代码中,空值行对应的str.contains()结果是NaN,取反后依然是NaN,所以这部分行被当作不符合条件的行移除了。

na=False参数的作用

na=False是显式指定:当遇到空值时,str.contains()直接返回False。

此时空值行对应的~False为True,会被保留在结果里;而包含目标字符串的行返回True,取反后为False,会被过滤,完全符合筛选需求。

额外说明

  • case=False是可选参数,作用是忽略大小写匹配,避免因大小写差异漏筛(比如vip和VIP都会被识别)
  • 只要需要保留空值行,就必须显式设置na参数,默认的NaN返回值会导致空值行被过滤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:36:24