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

时间:2017-09-07 14:12:23

标签: python pandas numpy

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

Foo    Bar
A      Sock    
B      Shoe    
C      Glove   
D      Hat     

但我想生成第三列(Zoo):

Foo    Bar    Zoo
A      Sock    3
B      Shoe    3
C      Glove   2
D      Hat     1

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

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'或者'所以'包括然后返回val = 3.

我试过了:

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

但我真的需要它作为if语句,以便' else'可以捕捉到与我的琴弦不相符的一切。有任何想法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

或者您可以使用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

答案 2 :(得分:1)

我喜欢上面的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)