Python 为什么嵌套的if/else在数据帧字符串匹配逻辑中不起作用

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'

数据帧(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'):
        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