如何处理 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]
失败并触发该错误。
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]
失败并触发该错误。