移除含?的DataFrame行触发nothing to repeat错误的解决求助
解决DataFrame移除含"?"行时的正则报错问题
你遇到的error: nothing to repeat at position 0是因为?是正则表达式的特殊元字符,它用来表示匹配前面的元素0次或1次。当你直接用str.contains("?")时,正则引擎找不到?前面的可重复元素,所以抛出语法错误。而数字或字母不是正则元字符,所以用它们的时候不会报错。
另外你原来的代码还有个问题:循环里的筛选操作只是生成了临时的DataFrame切片,但没有把结果重新赋值给data,所以原数据根本不会被修改。
下面是两种可行的解决方案:
方案1:关闭正则匹配模式
直接告诉str.contains按普通字符串匹配,不用解析正则表达式,这样?就只是普通字符:
column_names = ["thick", "size_uni", "shape_uni", "marg_adh", "size_epi_sieze", "bare_nuc", "bland_chromo","norm_chromo", "mitosis", "outcome"] data = data.astype(str) # 筛选出所有指定列都不含"?"的行 data = data[~data[column_names].apply(lambda col: col.str.contains("?", regex=False)).any(axis=1)]
方案2:转义正则特殊字符
把?转义成普通字符,在Python字符串里用原始字符串r"\?"或者双反斜杠"\\?":
column_names = ["thick", "size_uni", "shape_uni", "marg_adh", "size_epi_sieze", "bare_nuc", "bland_chromo","norm_chromo", "mitosis", "outcome"] data = data.astype(str) data = data[~data[column_names].apply(lambda col: col.str.contains(r"\?")).any(axis=1)]
补充说明
~用来取反,把"包含?"的行排除掉.any(axis=1)用来检查每一行是否有任意一列包含"?",只要有一列包含就排除整行- 如果要检查DataFrame的所有列而不是指定列,直接去掉
column_names,写成data[~data.apply(lambda col: col.str.contains("?", regex=False)).any(axis=1)]
内容的提问来源于stack exchange,提问作者gracestar8
相关产品推荐
相关产品推荐

