将 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('')
有没有一种方法可以应用 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('')