实际上应该很简单。我有一个PD系列栏['barcode'],我想从中获取过滤器EAN(带12、13或14位数字的条形码(。使用Regex我将循环中的新列表附加到一个新列表中。我如何同时删除原始系列的行?
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)
问题伴随着我评论的行。这不是正确的方法,但我不知道还有什么可能。你能帮我删除行吗?
预先感谢!
我只是将所有内容都累积到列表中,然后掉落,然后在您迭代时突变对象,这是在要求麻烦!
首先,将其变成MWE:
import re
import pandas as pd
df = pd.DataFrame(
[(i, '1' * i) for i in range(10, 17)],
columns=['i', 'barcode']
)
为我们提供了一个带有两个列的简单数据框到列:
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)]
但我会说这样的代码在不可读的