如何将 'any' 添加到以特征为参数的 lambda 函数?

How to add an 'any' to a lambda function where features are arguments?

提供以下数据框:

    name      both     one
1  'ABC AB'  'AA-BB'  
2  'AB NNN'  'AA-CC' 
3  'CCC MM'  'DD-BB'
4  'MM NNN'  'DD-CC'

我想用特征 both 的第一个或第二个元素填充特征 one 基于特征 name 的值是否包含 [=18] =] 某个列表的项目。

例如对于上面的列表,如果 name 的值包含 lst 的任何一项,则属于 one 的值应该是 both 的第二部分,否则是第一部分部分。输出应该看起来像

lst = ["AB", "NNN"]

    name      both     one
1  'ABC AB'  'AA-BB'  'BB'  
2  'AB NNN'  'AA-CC'  'CC' 
3  'CCC MM'  'DD-BB'  'DD'
4  'MM NNN'  'DD-CC'  'CC'

我已经尝试了下面的两种方法,但都没有完全奏效。

else 的结果实际上按预期工作,但不是 iftrue

df["one"] = df["both"].apply(lambda x: x.split("_")[1]
                                       if any(n in df["name"] for n in lst)
                                       else x.split("_")[0])

⬆️ 这不会 return 错误,但 return if 过滤器的匹配结果也不会

df["one"] = df.apply(lambda x: x["both"].split("_")[1]
                               if any(n in x["name"] for n in lst)
                               else x["both"].split("_")[0])

⬆️ 这个return是一个KeyError: 'name'

感谢您的帮助!

import pandas as pd

lst = {'AB', 'NNN'}
df = pd.DataFrame({'name': ['ABC AB', 'AB NNN', 'CCC MM', 'MM NNN'],
                   'both': ['AA-BB', 'AA-CC', 'DD-BB', 'DD-CC']})

df['one'] = df.apply(lambda x: x['both'].split('-')[1] if set(x['name'].split()).intersection(lst) else x['both'].split('-')[0], axis=1)

print(df)

输出:

     name   both one
0  ABC AB  AA-BB  BB
1  AB NNN  AA-CC  CC
2  CCC MM  DD-BB  DD
3  MM NNN  DD-CC  CC

(在您的第二次尝试中,您使用了下划线而不是连字符,并且您没有指定坐标轴)。