【问题标题】:Exception handling when using pandas apply使用 pandas 时的异常处理 apply
【发布时间】:2018-02-20 14:04:12
【问题描述】:

我可以使用 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 函数以使其工作?我很好奇如何使用 apply 函数来使用 str.extract 完成相同的任务。非常感谢。

【问题讨论】:

标签: python pandas dataframe exception-handling apply


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2018-04-21
      • 2012-08-19
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多