при работе со строками понимание обычного списка может быть быстрее по сравнению с векторизованными методами Pandas:
In [5]: df.loc[['phish' in u for u in df.url_type_txt], 'url_type'] = 1
In [6]: df
Out[6]:
url_type url_type_txt
0 1 phishing/fraud
1 2 trojan
2 2 trojan
3 1 phishing
Время для 40 000 строк DF:
In [7]: df = pd.concat([df] * 10**4, ignore_index=True)
In [8]: df.shape
Out[8]: (40000, 2)
In [9]: %timeit df.loc[df.url_type_txt.str.lower().str.contains('phish'), 'url_type']
103 ms ± 875 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [10]: %timeit df.loc[['phish' in u for u in df.url_type_txt], 'url_type']
10.7 ms ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [11]: %timeit df.loc[['phish' in u.lower() for u in df.url_type_txt], 'url_type']
19.3 ms ± 48.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [12]: %timeit df.loc[['phish' in u for u in df.url_type_txt.str.lower()], 'url_type']
41.1 ms ± 123 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)