如何基于正则表达式从pd series或dataframe中删除行?

2024-04-20 11:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

其实应该很简单。我有一个pd系列的条形码['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("\d{12,14}", i)
    if(x):
        ean.append(x.group())
        #bar.drop(bar['Barcode']==x.string, inplace=True)
print(ean)

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

提前谢谢


Tags: csv过滤器列表readbar数字eanbarcode
1条回答
网友
1楼 · 发布于 2024-04-20 11:18:46

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

首先,将其制作成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)]

但我认为这样的代码几乎是不可读的

相关问题 更多 >