将正则表达式应用于新列中的 df 添加值



这是我的数据集:

BlaBla 128 MB EE
ADTD 6 gb DTS
EEEDC 2GB RS
STA 12MB DFA
BBNB 32 mb YED

我想从这个数据集中提取 MB/GB 的数量和单位 MB/GB。因此,我创建了以下正则表达式:

(d*)s?(MB|GB)

我为将正则表达式应用于我的 df 而创建的代码是:

pattern = re.compile(r'(d*)s?(MB|GB)')
invoice_df['mbs'] = invoice_df['Rate Plan'].apply(lambda x: pattern.search(x).group(1))
invoice_df['unit'] = invoice_df['Rate Plan'].apply(lambda x: pattern.search(x).group(2))

但是,当将正则表达式应用于我的 df 时,它会给出以下错误消息:

AttributeError: 'NoneType' object has no attribute 'group'

我能做些什么来解决这个问题?

由于某些条目可能不匹配,因此re.search会失败(返回任何匹配项)。您需要考虑 lambda 中的这些情况:

apply(lambda x: pattern.search(x).group(1) if pattern.search(x) else "")

我也建议使用

(?i)(d+)s*([MGK]B)

它将找到1+位数字(d+,组1)后跟0+空格(s*),并将KBGBMB以不区分大小写的方式匹配到第2组(([MGK]B))。

您只需要在请求组之前检查是否已找到某些内容:

import re
inputs = ["BlaBla 128 MB EE",
"ADTD 6 gb DTS",
"EEEDC 2GB RS",
"STA 12MB DFA",
"BBNB 32 mb YED",
"Nothing to find here"]
pattern = re.compile("(d+)s*([MG]B)", re.IGNORECASE)
for input in inputs:
match = re.search(pattern, input)
if match:
mbs = match.group(1)
unit = match.group(2)
print (mbs, unit.upper())
else:
print "Nothing found for : %r" % input
# ('128', 'MB')
# ('6', 'GB')
# ('2', 'GB')
# ('12', 'MB')
# ('32', 'MB')
# Nothing found for : 'Nothing to find here'

使用您的代码:

pattern = re.compile("(d+)s*([MG]B)", re.IGNORECASE)
match = re.search(pattern, invoice_df['Rate Plan'])
if match:
invoice_df['mbs'] = match.group(1)
invoice_df['unit'] = match.group(2)

恕我直言,它比 lambda 更具可读性,并且不会执行两次搜索。

最新更新