使用 pandas apply 时的异常处理
Exception handling when using pandas apply
我可以使用 series.str.extract 从 pandas 系列中提取子字符串。
ds = pd.Series(['1A apple', '1B pear', '3C orange', 'grape'])
ds.str.extract('(\d.{1}).*', expand=False)
我最初尝试的是使用应用功能。
ds.apply(lambda x: re.search('(\d.{1}).*', x).group(1))
我收到错误消息:
AttributeError: 'NoneType' object has no attribute 'group'
似乎搜索模式不适用于第四个元素'grape'
。所以它返回一个非类型。我的问题是如何修复上面的应用函数以使其工作?我很好奇如何使用 apply 函数使用 str.extract 来完成相同的任务。非常感谢。
您将需要一个自定义函数来处理错误,就这么简单。您可以使用 try...except
块或使用 if
语句来测试 re.search
返回的匹配对象的值。
def search(x):
try:
return re.search('(\d.{1}).*', x).group(1)
except AttributeError:
return np.nan
ds.apply(search)
0 1A
1 1B
2 3C
3 NaN
dtype: object
你可以用 lambda
变得可爱,并使用 if/else
来检查 re.search
的结果是否为 None
。从技术上讲,我只是在评估搜索结果的真实性。但是如果找到模式,re.search
应该求值为 True
,否则求值为 False
,所以这应该有效。
ds.apply(
lambda x: (
lambda y: y.group(1) if y else np.nan
)(re.search('(\d.{1}).*', x))
)
0 1A
1 1B
2 3C
3 NaN
dtype: object
做同样事情的不那么可爱的方式
def search(x):
s = re.search('(\d.{1}).*', x)
if s:
return s.group(1)
ds.apply(search)
0 1A
1 1B
2 3C
3 None
dtype: object
我可以使用 series.str.extract 从 pandas 系列中提取子字符串。
ds = pd.Series(['1A apple', '1B pear', '3C orange', 'grape'])
ds.str.extract('(\d.{1}).*', expand=False)
我最初尝试的是使用应用功能。
ds.apply(lambda x: re.search('(\d.{1}).*', x).group(1))
我收到错误消息:
AttributeError: 'NoneType' object has no attribute 'group'
似乎搜索模式不适用于第四个元素'grape'
。所以它返回一个非类型。我的问题是如何修复上面的应用函数以使其工作?我很好奇如何使用 apply 函数使用 str.extract 来完成相同的任务。非常感谢。
您将需要一个自定义函数来处理错误,就这么简单。您可以使用 try...except
块或使用 if
语句来测试 re.search
返回的匹配对象的值。
def search(x):
try:
return re.search('(\d.{1}).*', x).group(1)
except AttributeError:
return np.nan
ds.apply(search)
0 1A
1 1B
2 3C
3 NaN
dtype: object
你可以用 lambda
变得可爱,并使用 if/else
来检查 re.search
的结果是否为 None
。从技术上讲,我只是在评估搜索结果的真实性。但是如果找到模式,re.search
应该求值为 True
,否则求值为 False
,所以这应该有效。
ds.apply(
lambda x: (
lambda y: y.group(1) if y else np.nan
)(re.search('(\d.{1}).*', x))
)
0 1A
1 1B
2 3C
3 NaN
dtype: object
做同样事情的不那么可爱的方式
def search(x):
s = re.search('(\d.{1}).*', x)
if s:
return s.group(1)
ds.apply(search)
0 1A
1 1B
2 3C
3 None
dtype: object