如何将 '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
的结果实际上按预期工作,但不是 if
的 true
。
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
(在您的第二次尝试中,您使用了下划线而不是连字符,并且您没有指定坐标轴)。
提供以下数据框:
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
的结果实际上按预期工作,但不是 if
的 true
。
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
(在您的第二次尝试中,您使用了下划线而不是连字符,并且您没有指定坐标轴)。