python - 在给定正则表达式的情况下删除 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
所有的行都消失了。并非所有这些都是有问题的
解决方案
您与您的正则表达式非常接近,但有一些小问题。
方法一,在特定列中清理
如果您知道哪一列出现问题,我们可以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.apply
with.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
推荐阅读
- sequelize.js - 如何使用`selectGraphQLResultFromTable` 在后图形解析器中加载 Sequelize 查询的关系?
- arm - STM32F103在KEIL IDE下支持浮点吗
- kentico - 创建自定义同义词列表
- computer-vision - 为我的图像应用多 Otsu 阈值
- pandas - Pandas 适用于 group by 以进行文本连接
- plugins - 将 tt_content 的 TCA 更改为子类型?
- ssl - 套接字 sslerror 握手失败 Python 2.4.3
- php - MAMP 4.2 + CodeIgnter 4.1:无法在 Windows 10 环境下加载 PHP 7.4.1 中的 intl 扩展
- assembly - How to split a 32-bit integer to two 16-bit half-words
- r - 在条件发生变化的情况下按条件创建序列