Python 将正则表达式应用于df在新列中添加值
这是我的数据集:Python 将正则表达式应用于df在新列中添加值,python,regex,Python,Regex,这是我的数据集: 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
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'
我能做些什么来解决这个问题?您只需在请求组之前检查是否找到了某些内容:
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 IMHO更具可读性,并且不会执行两次搜索。由于某些条目可能不匹配,因此
重新搜索失败(返回不匹配)。您需要考虑lambda中的这些情况:
apply(lambda x: pattern.search(x).group(1) if pattern.search(x) else "")
我也建议使用
(?i)(\d+)\s*([MGK]B)
它将找到1+个数字(\d+
,第1组),后跟0+个空格(\s*
),并以不区分大小写的方式将KB
、GB
、MB
匹配到第2组(([MGK]B)
)中。如果将该模式设置为不区分大小写呢<代码>(?i)(\d+)\s*(MB | GB)
?我还将+
与\d
和*
与\s
@WiktorStribiż一起使用+
查看仍然相同的错误消息,因此,有些条目只是不包含匹配项,您访问组(1)
和组(2)
,而不检查是否出现匹配项。是的,这也是我所期望的。我知道存在不匹配的条目…我希望将其保留为空。请尝试apply(lambda x:pattern.search(x).group(1)if pattern.search(x)else“”)