如何根据正则表达式从 pd 系列或数据框中删除行?

Posted

技术标签:

【中文标题】如何根据正则表达式从 pd 系列或数据框中删除行?【英文标题】:How to delete rows from pd series or dataframe based on regex? 【发布时间】:2019-09-21 22:08:32 【问题描述】:

其实应该很简单。我有一个 pd 系列 bar['Barcode'] 我想从中获取过滤器 eans(12、13 或 14 位的条形码)。使用正则表达式,我将附加到循环中的新列表。如何同时删除原始系列中的行?

bar = pd.read_csv("barcode.csv", header=0, sep=';', engine='python')

ean = []
for i in bar['Barcode']:
    x = re.search("\d12,14", i)
    if(x):
        ean.append(x.group())
        #bar.drop(bar['Barcode']==x.string, inplace=True)
print(ean)

问题出在我注释掉的那一行。这不是正确的方法,但我不知道还有什么可能。你能帮我删除这些行吗?

提前致谢!

【问题讨论】:

提供barcode['Barcode'] 的摘录可能会有所帮助。 注意:这非常接近***.com/q/25292838/1358308 【参考方案1】:

我只是将所有内容累积到一个列表中,然后删除,在您迭代对象时对其进行变异是自找麻烦!

首先,将其变成 MWE:

import re
import pandas as pd

df = pd.DataFrame(
    [(i, '1' * i) for i in range(10, 17)],
    columns=['i', 'barcode']
)

这为我们提供了一个包含两列的简单数据框,然后我们可以走详细路线来定义一个函数来进行匹配并applying 这个 到专栏:

def match(s):
    m = re.match(r'^\d12,14$', s)
    if m:
        return m.group()

df['match'] = df['barcode'].apply(match)

注意,我在字符串的开头使用r 来关闭转义,并使用^$ 来匹配字符串的开头和结尾。

然后您可以使用它来过滤数据框:

df[~df['match'].isnull()]

这为我们提供了匹配的三行。

如果你想要一个单行并且不关心匹配的字符串,你可以这样做:

df[df['barcode'].apply(lambda s: re.match(r'^\d12,14$', s) is not None)]

但我想说这样的代码几乎是不可读的

【讨论】:

以上是关于如何根据正则表达式从 pd 系列或数据框中删除行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件表达式从熊猫数据框中删除行[重复]

如何根据条件表达式从熊猫数据框中删除行[重复]

按日期范围删除数据框中的行。

从熊猫数据框中删除重复行:不区分大小写的比较

如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?

vs 删除行尾空格