将 apply lambda 与 if else 条件一起使用而不计算条件两次

Use apply lambda with if else conditional without computing the condition twice

有没有一种方法可以应用 lambda 语句而不必计算 x.split(' ')[0] 两次?我知道它可以使用一个函数来完成,即 .apply(lambda x: pre_dir(x) 并处理那里的逻辑,但想知道它是否可以在一行中完成。

address.insert(6, 'PRE_DIR', address['STREETNAME'].apply(lambda x: x.split(' ')[0] if x.split(' ')[0] in ['N', 'S', 'E', 'W'] else ''))

您可以使用 where 而不是 apply。换句话说,替换

address['STREETNAME'].apply(lambda x: x.split(' ')[0] if x.split(' ')[0] in ['N', 'S', 'E', 'W'] else '')

来自

address['STREETNAME'].str.split(' ').str[0].where(lambda x: x.isin(['N', 'S', 'E', 'W']), '')

示例:对于以下 DataFrame

address = pd.DataFrame({'STREETNAME':['North Ave', '1st St', 'W 34th St']})

以上代码生成以下列:

    0     
    1     
    2    W

with python ≥ 3.8 你可以使用 assignment expression:

lambda x: y if (y:=x.split(' ')[0]) in ['N', 'S', 'E', 'W'] else '')

就是说,IIUC,您可以在此处使用正则表达式:

address['STREETNAME'].str.extract('^([NSEW]) ').fillna('')