如何处理 lambda 表达式中的正则表达式和空值?

How do I handle regex and null values inside a lambda expression?

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() 绕过 null值,但我仍然收到以下错误:“'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)

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

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

输出:

          0
0      1324
1       NaN
2  25647900
3     34254

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