我试图确定特定列是否包含字符串的前三个字母,然后根据字符串中前两个字符是否匹配在新列中生成新值。现在我的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'可以捕捉到与我的琴弦不相符的一切。有任何想法吗?
答案 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)