Используйте это:
Составьте словарь справочной базы данных:
d = dict(zip(df2.colB,df2.colC))
#{'hjo': 12, 'hhh chk': 14, 'abc': 17}
создайте шаблон:
pat = r'({})'.format('|'.join(d.keys()))
#'(hjo|hhh chk|abc)'
Используйте s.str.extract
и s.map()
df['colC']=df.colA.str.extract(pat, expand=False).dropna().map(d)
print(df)
colA colC
0 abc dbe fec 17.0
1 ghi jkl ref NaN
2 sgsh hjo 12.0
РЕДАКТИРОВАТЬ для переключения escape-символа и пробела вкаждая строка * (Не уверен, что лучше, но работает) *
Учитывая, что df2
:
colB colC
0 hjo 12
1 hhh ref 14
2 abc 17
и df1 такие же, как в вашем примере:
colA
0 abc dbe fec
1 ghi jkl ref
2 sgsh hjo
import re
df_split=pd.DataFrame(df2.colB.str.split(' ').tolist(),index=df2.colC).stack().reset_index(0).rename(columns={0:'colB'}).reindex(df2.columns,axis=1)
print(df_split)
colB colC
0 hjo 12
0 hhh 14
1 ref 14
0 abc 17
вы заметите, что столбцы с пробелами преобразуются в строки с одинаковыми значениями
d = dict(zip(df_split.colB,df_split.colC))
#{'hjo': 12, 'hhh': 14, 'ref': 14, 'abc': 17}
keys=[re.sub('[^A-Za-z0-9]+', '', i) for i in d.keys()]
pat = r'({})'.format('|'.join(keys))
df['colC']=df.colA.str.extract((pat),expand=False).map(d)
print(df)
colA colC
0 abc dbe fec 17
1 ghi jkl ref 14
2 sgsh hjo 12