请求解析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
相关产品推荐
相关产品推荐

