Используйте словарь и по столбцам операции:
d = {'image_jpg': ['image/jpeg','image/jpg','image/pjpeg'],
'image_png': ['image/png','image/x-png','application/png'],
'image_gif': ['image/gif']}
d_rev = {w: k for k, v in d.items() for w in v}
for k, v in d_rev.items():
mask = df['content_type'].str.contains(v, regex=False)
df.loc[mask, 'name'] = df.loc[mask, 'sys_id'] + '.' + k.split('/')[-1]
Или, если требуется равенство:
for k, v in d_rev.items():
mask = df['content_type'].eq(v)
df.loc[mask, 'name'] = df.loc[mask, 'sys_id'] + '.' + k.split('/')[-1]
Для случая равенства: @ 1010 * решение * @ AntonvBR лучше.
Пояснение
d_rev
отображает каждое значение списка на ключ: -
print(d_rev)
{'application/png': 'image_png', 'image/gif': 'image_gif',
'image/jpeg': 'image_jpg', 'image/jpg': 'image_jpg',
'image/pjpeg': 'image_jpg', 'image/png': 'image_png',
'image/x-png': 'image_png'}
Поскольку существует очень мало категорий и большое количество строк, более эффективно перебирать словарь и использовать оптимизированные операции по столбцам.Помните, iterrows
- это просто медленный цикл строк, он всегда будет неэффективным для большого количества строк.