如何删除pandas DataFrame中FEATURE列以[NA]开头的行
问题原因分析
你之前两段代码无效的原因分别如下:
- 第一段
df[~df.FEATURE.str.contains("[NA]")]:str.contains默认开启正则匹配,[NA]在正则语法中是字符集匹配规则,只会匹配单个字符N或者A,完全无法匹配[NA]这个完整的字符串前缀;另外如果执行后没有重新赋值给df,原DataFrame也不会发生变化。 - 第二段
df.drop(df['FEATURE'].str.startswith('[NA]')):df.drop()方法接收的参数是要删除的行索引/列名,你传入的是一个布尔类型的Series,完全不符合参数要求,自然不会生效。
正确实现方式
方案1:使用startswith(最适合前缀匹配场景)
# na=False 是为了避免FEATURE列为空时返回NaN导致索引报错,匹配成功的行会被过滤掉 df = df[~df['FEATURE'].str.startswith('[NA]', na=False)]
如果希望直接修改原DataFrame,也可以用drop写法:
df.drop(df[df['FEATURE'].str.startswith('[NA]', na=False)].index, inplace=True)
方案2:使用contains匹配
如果要坚持用str.contains,需要关闭正则匹配或者转义特殊字符:
# 方式1:关闭正则匹配,把[NA]当成普通字符串处理 df = df[~df['FEATURE'].str.contains('[NA]', regex=False, na=False)] # 方式2:正则转义方括号,^限制从开头匹配,更贴合你的需求 df = df[~df['FEATURE'].str.contains(r'^\[NA\]', na=False)]
注意:所有操作默认返回新的DataFrame,必须赋值给原变量或者加
inplace=True才会修改原数据。
内容的提问来源于stack exchange,提问作者chip
相关产品推荐
相关产品推荐

