如何基于正则表达式从PD系列或数据帧中删除行?

时间:2019-05-03 11:02:12

标签: python pandas dataframe

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我只是将所有内容累积到列表中,然后放下,在您迭代对象时对其进行变异就麻烦了!

首先,使其成为MWE:

import re
import pandas as pd

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

这为我们提供了一个具有两列的简单数据框,然后我们可以走冗长的路线定义一个函数来进行匹配,然后apply 到列:

def match(s):
    m = re.match(r'^\d{12,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'^\d{12,14}$', s) is not None)]

但是我想说这样的代码在不可读的边缘上