首页 > 解决方案 > 在给定正则表达式的情况下删除 pandas 中的行

问题描述

我有一个我之前转置的数据框。在转置之前,数值列的值是 float64,这是预期的。但是,在转置之后,浮点值变成了字符串。我尝试使用 .as_type('float') 转换数据框,但由于某些列在同一单元格中具有类似 '4.32 6.50' 的值,因此引发了异常。

我尝试使用正则表达式,但是当我让它工作时,只返回如下内容:

假 假 假 ... 假 假

我的数据框如下所示:

q1       q2   q3   q4
4.22     4.11 3.89 4.11
5        2.36 3.68 4.23
1.2 4.63 4.28 5.67 4.87

有超过 1000 行,并且数据框中有多个有问题的行。我不知道他们是什么。因此,手动删除它不是一个选项

我尝试了以下代码

final = final[~final['q1'].str.contains("\d+\.\d\s\d+\.\d", na = False)]

但是,有问题的行仍然存在。

最终结果如下所示

q1 q2 q3 q4

所有的行都消失了。并非所有这些都是有问题的

标签: pythonregexpandas

解决方案


您与您的正则表达式非常接近,但有一些小问题。


方法一,在特定列中清理

如果您知道哪一列出现问题,我们可以str.contains在特定列上使用:

m = ~df['q1'].str.contains('\d+\.\d+\s\d+\.\d+')
df[m]

输出

     q1    q2    q3    q4
0  4.22  4.11  3.89  4.11
1     5  2.36  3.68  4.23

方法2,搜索所有列

如果您不确定是哪一列出现了问题。我们可以使用DataFrame.applywith.str.contains然后删除any具有多个值的单元格的行:

m = ~df.apply(lambda x: x.str.contains('\d+\.\d+\s\d+\.\d+')).any(axis=1)
df[m]

输出

     q1    q2    q3    q4
0  4.22  4.11  3.89  4.11
1     5  2.36  3.68  4.23

方法3,删除带有空格的行(有点危险)

首先我们删除左右边框上的空格,而不是删除中间有空格的行:

df = df.apply(lambda x: x.str.strip())

m = ~df.apply(lambda x: x.str.contains('\s')).any(axis=1)
df[m]

输出

     q1    q2    q3    q4
0  4.22  4.11  3.89  4.11
1     5  2.36  3.68  4.23

推荐阅读