Учитывая данные, заполненные электронными письмами, я хочу отфильтровать строки, содержащие потенциально заблокированные доменные имена или явно поддельные электронные письма. Кадр данных ниже представляет пример моих данных.
>> print(df)
email number
1 fake@fake.com 2
2 real.email@gmail.com 1
3 no.email@email.com 5
4 real@yahoo.com 2
5 rich@money.com 1
Я хочу отфильтровать по двум спискам. Первый список fake_lst = ['noemail', 'noaddress', 'fake', ... 'no.email']
. Второй список - это просто набор from disposable_email_domains import blocklist
, преобразованный в список (или сохраненный как набор).
Когда я использую df = df[~df['email'].str.contains('noemail')]
, он работает нормально и отфильтровывает эту запись. Тем не менее, когда я делаю df = df[~df['email'].str.contains(fake_lst)]
, я получаю TypeError: unhashable type: 'list'
.
Очевидный ответ заключается в использовании df = df[~df['email'].isin(fake_lst)]
, как и во многих других вопросах, связанных со стековым потоком, например, Фильтр Pandas Кадр данных на основе списка подстрок или pandas, фильтрация с использованием функции isin но в итоге это не дает никакого эффекта.
Полагаю, я мог бы использовать str.contains('string')
для каждой возможной записи в списке, но это нелепо громоздко.
Поэтому мне нужно отфильтровать это фрейм данных на основе подстрок, содержащихся в двух списках, так что любое электронное письмо, содержащее конкретную подстроку, от которой я хочу избавиться, и последующую строку, в которой она содержится, удаляются.
В приведенном выше примере фрейм данных после фильтрация будет:
>> print(df)
email number
2 real.email@gmail.com 1
4 real@yahoo.com 2
5 rich@money.com 1