Python 为什么嵌套的if/else在数据帧字符串匹配逻辑中不起作用
数据帧(test1): 输出:Python 为什么嵌套的if/else在数据帧字符串匹配逻辑中不起作用,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,数据帧(test1): 输出: cons_flag new_var Mas MASOM Mas MASOM Wood MASOM Wood MASOM Wood MASOM Mas MASOM Conc MASOM Wood MASOM 使用的代码: for x in test1['cons_flag']: if x.find('Mas'): test1['new_var']="MASOM" elif x.find('Wood'
cons_flag new_var
Mas MASOM
Mas MASOM
Wood MASOM
Wood MASOM
Wood MASOM
Mas MASOM
Conc MASOM
Wood MASOM
使用的代码:
for x in test1['cons_flag']:
if x.find('Mas'):
test1['new_var']="MASOM"
elif x.find('Wood'):
test1['new_var']= "WOODEN"
我的问题是new\u var
列值没有按照我的逻辑进行更新。不要为此使用for
循环。相反,您可以使用numpy.where
对逻辑进行矢量化
df['new_flag'] = np.where(df['cons_flag'].str.contains('Mas'), 'MASOM',
np.where(df['cons_flag'].str.contains('Wood'),
'WOODEN', 'No match'))
# cons_flag new_flag
# 0 Mas MASOM
# 1 Mas MASOM
# 2 Wood WOODEN
# 3 Wood WOODEN
# 4 Wood WOODEN
# 5 Mas MASOM
# 6 Conc No match
# 7 Wood WOODEN
您的逻辑总是会失败,因为您将矢量化计算与非矢量化条件混合在一起。通过设置
test1['new_var']='MASOM'
,您为整个系列分配了一个常数,而不仅仅是一行。不起作用,现在只在输出中给出“woodn”.您根本没有解释问题,也没有解释代码…我希望MASOM代表MAS,woodn代表Wood,但我想使用if-elif-logic onlytank快速响应,但你能解释一下为什么逻辑不正确吗working@SandyFWIW,它也永远不会进入elif
语句'Wood'。find('Wood')
返回0
,因为Wood
位于字符串的开头。它本质上是针对一个错误的值进行测试。再一次,一个查询,我可以为比较添加多个值吗,例如df['new_flag']=np.where(df['cons_flag'].str.contains('Mas','Conc'),'Mas_Conc','None')。类似的用法使用正则表达式,类似于:df['new_flag']=np.where(df['cons_flag'].str.contains('Mas | Conc'),'Mas_Conc','None')
df['new_flag'] = np.where(df['cons_flag'].str.contains('Mas'), 'MASOM',
np.where(df['cons_flag'].str.contains('Wood'),
'WOODEN', 'No match'))
# cons_flag new_flag
# 0 Mas MASOM
# 1 Mas MASOM
# 2 Wood WOODEN
# 3 Wood WOODEN
# 4 Wood WOODEN
# 5 Mas MASOM
# 6 Conc No match
# 7 Wood WOODEN