Python 匹配pandas中的字符串以生成具有值的新列

Python 匹配pandas中的字符串以生成具有值的新列,python,pandas,numpy,Python,Pandas,Numpy,我试图确定特定列是否包含字符串的前三个字母,然后根据字符串中的前两个字符是否匹配,在新列中生成一个新值。现在我的DF看起来像这样: Foo Bar A Sock B Shoe C Glove D Hat 但我想生成第三列(Zoo): 现在,我的代码看起来像这样,但不起作用: def f(row): if row['Bar'] str.startswith('Sh'| 'So'): val =

我试图确定特定列是否包含字符串的前三个字母,然后根据字符串中的前两个字符是否匹配,在新列中生成一个新值。现在我的DF看起来像这样:

Foo    Bar
A      Sock    
B      Shoe    
C      Glove   
D      Hat     
但我想生成第三列(Zoo):

现在,我的代码看起来像这样,但不起作用:

def f(row):
    if row['Bar'] str.startswith('Sh'| 'So'):
         val = 3
    elif row['Bar'] str.startswith('Gl'):
          val = 2
    else: 
           val = 1
       return val    


df['Zoo'] = df.apply(f, axis = 0 )
如果包含“Sh”或“So”,则返回值应为,然后返回val=3

我试过这个:

df.loc[df['Bar'].str.startswith('Sh|So'), ['Zoo']] = 3
df.loc[df['Bar'].str.startswith('Gl'), ['Zoo']] = 2

但我真的需要它作为if语句,这样“else”就可以捕获与我的字符串不匹配的所有内容。有什么想法吗

或者您可以使用
replace

In [14]: df
Out[14]: 
  Foo    Bar
0   A   Sock
1   B   Shoe
2   C  Glove
3   D    Hat

In [15]: ZOO_VAL = {
    "So": 3,
    "Sh": 3,
    "Gl": 2
}

In [16]: df['Zoo'] = df['Bar'].map(lambda x: ZOO_VAL.get(x[:2], 1))

In [17]: df
Out[17]: 
  Foo    Bar  Zoo
0   A   Sock    3
1   B   Shoe    3
2   C  Glove    2
3   D    Hat    1
df.assign(Zoo=pd.to_numeric(df.Bar.str[:2].replace({'So':3,'Sh':3,'Gl':2}),errors='coerce').fillna(1))
Out[108]: 
  Foo    Bar  Zoo
0   A   Sock  3.0
1   B   Shoe  3.0
2   C  Glove  2.0
3   D    Hat  1.0

或者您可以使用
replace

df.assign(Zoo=pd.to_numeric(df.Bar.str[:2].replace({'So':3,'Sh':3,'Gl':2}),errors='coerce').fillna(1))
Out[108]: 
  Foo    Bar  Zoo
0   A   Sock  3.0
1   B   Shoe  3.0
2   C  Glove  2.0
3   D    Hat  1.0

我喜欢上面grechut的答案,但要修复您的原始代码:

def f(row):
    if row.startswith('Sh') or row.startswith('So'):
        val = 3
    elif row.startswith('Gl'):
        val = 2
    else: 
        val = 1
    return val 

df['Bar'].apply(f)

我喜欢上面grechut的答案,但要修复您的原始代码:

def f(row):
    if row.startswith('Sh') or row.startswith('So'):
        val = 3
    elif row.startswith('Gl'):
        val = 2
    else: 
        val = 1
    return val 

df['Bar'].apply(f)