【问题标题】:How do I handle regex and null values inside a lambda expression?如何处理 lambda 表达式中的正则表达式和 null 值?
【发布时间】:2021-05-23 11:27:55
【问题描述】:
import pandas as pd
import re
df = pd.DataFrame({"A":['1324 cats',pd.np.nan,'There were 25647900 tickets',34254], "B":[543,678678,0,0]})

在一个示例 DataFrame 中,就像上面的那个一样,我正在尝试计算一个新列,我在其中提取任何连续的数字运行。在单元格中只有一个整数的情况下,当我将单元格值交给 re.search() 时,我将单元格值视为字符串,并且我正在尝试使用 pd.isna() 绕过空值,但我仍然得到以下错误:“'NoneType' 对象不可下标”

df['C'] = df['A'].apply(lambda x: re.search(r'\d+',str(x))[0] if not pd.isna(x) else x)

这种方法在不涉及 re 的过程中效果很好,如下所示:

df['C'] = df['A'].apply(lambda x: 'Y' if not pd.isna(x) else x)

【问题讨论】:

    标签: python pandas null nan re


    【解决方案1】:

    您可以尝试将列转换为字符串类型,然后使用str.extract(相当于re.search):

    df['A'].astype(str).str.extract('(\d+)')
    

    输出:

              0
    0      1324
    1       NaN
    2  25647900
    3     34254
    

    注意:如果每一行都包含一个捕获(一些数字),您的代码将正常工作。 re.search 在未找到该模式时返回 None,因此 re.search(...)[0] 失败并触发该错误。

    【讨论】:

    • 谢谢,很好奇,如果有多个数字,这会像 re.search 一样工作吗?即,“有 452 个月有 14 英寸的雨”产生 452 和 14?
    • .str.extractall 而不是.str.extract
    • 谢谢,结合这篇文章中的 unstack 和 null 处理,我认为这让我无法摆脱困境。 stackoverflow.com/questions/42379389/… 仍然有兴趣了解如何在没有找到任何匹配项的情况下有条件地在 lambda 中使用 re 处理
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多