pandas如何删除某列符合正则表达式的数据所在行?

发布于 2022-09-11 17:39:52 字数 1044 浏览 17 评论 0

现有数据两列,如下图:

clipboard.png

然后我想删除a列中符合某正则表达式(如0002开头)的数据。该如何写?

添加:前面只是举例哈,因为不一定是XXXX开头,所以更希望是用re.正则表达式去匹配。谢谢楼下的回答。

另:现在遇到另个小问题,就是可能不止匹配一种,所以需要做个循环,代码如下:

        for shield in shields:
            shield = shield.strip()
            print("屏蔽规则:", shield)
            data.loc[:, 'c'] = data['a'].map(lambda x: 1 if re.match(shield, x) else np.nan)
            data = data[data['c'].isnull()]

会报一个警告:C:ProgramDataAnaconda3libsite-packagespandascoreindexing.py:543: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pand...
self.obj[item] = s

具体来说,就是最后一句的时候更改了原本的data,直接覆盖data,这样不太规范,但我确实是需要用新的data不断覆盖。怎么写更好呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静若繁花 2022-09-18 17:39:52
fun = df['a'].apply(lambda x: x.startswith('0002'))
print df[fun == False]
空城之時有危險 2022-09-18 17:39:52

我猜a列是16进制数?

del_bool_list = df['a'].apply(lambda x : not str(x).startswith('0002'))
df = df[del_bool_list]

我一开始被pd.drop() 这个方法误导了, 感觉删除就得用它, 后来一看一楼才明白, 直接覆盖掉也可以。
最后班门弄斧一下, pd.drop()最好有确定的索引再用, 否则, 会涉及存bool值的列表存索引值的列表转换的问题, 简单但不简洁

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文