我有一个数据框df_train,它的列为sub_division。
该列中的值如下所示
ABC_commercial,
ABC_Private,
Test ROM DIV,
ROM DIV,
TEST SEC R&OM
我正在尝试 1.将任何以ABC *开头的数字转换为数字(例如:1) 2.将包含ROM和R&OM的任何内容转换为数字(例如2)
谢谢。
预期结果:
1,
1,
2,
2,
2
答案 0 :(得分:1)
将numpy.select
与Series.str.startswith
和Series.str.contains
结合使用:
m1 = df['col'].str.startswith('ABC')
m2 = df['col'].str.contains('ROM|R&OM')
df['new'] = np.select([m1, m2], [1,2], default='no match')
#if need all numbers
#df['new'] = np.select([m1, m2], [1,2], default=0)
print (df)
col new
0 ABC_commercial, 1
1 ABC_Private, 1
2 Test ROM DIV, 2
3 ROM DIV, 2
4 TEST SEC R&OM 2
答案 1 :(得分:0)
您可以执行以下操作。请记住,如果没有匹配项,您将得到NaN
。您可以在else
函数中添加converter
大小写,以获取默认值。
def converter(v):
if v.startswith('ABC'):
return 1
elif any(i in v for i in ['ROM', 'R&OM']):
return 2
df['sub_division'] = df['sub_division'].apply(converter)
print(df.head(10))
输出:
sub_division
0 1
1 1
2 2
3 2
4 2
答案 2 :(得分:0)
您可以使用:
Collection