适用于使用pandas时的异常处理

时间:2018-02-17 06:21:42

标签: python pandas dataframe exception-handling 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函数使其工作?我很好奇如何使用apply函数来使用str.extract实现相同的任务。非常感谢。

2 个答案:

答案 0 :(得分:4)

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

affectStroke

答案 1 :(得分: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