使用pandas apply时的异常处理

4
我可以使用series.str.extract从Pandas系列中提取子字符串。
ds = pd.Series(['1A apple', '1B pear', '3C orange', 'grape'])
ds.str.extract('(\\d.{1}).*', expand=False)

我最初尝试使用 apply 函数。
ds.apply(lambda x: re.search('(\\d.{1}).*', x).group(1))

我收到了错误信息:
AttributeError: 'NoneType' object has no attribute 'group'

似乎搜索模式不适用于第四个元素“grape”。因此返回一个无类型值。我的问题是如何修复上面的应用函数使其工作?我想知道如何使用apply函数来使用str.extract完成相同的任务。非常感谢。

这个回答解决了你的问题吗?Pandas .apply()函数中的异常处理 - Georgy
2个回答

8

你需要一个自定义函数来处理错误,就这么简单。你可以使用 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

1
你可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接