Почему панды .isin намного быстрее, чем "в"? - PullRequest
1 голос
/ 25 сентября 2019

Я делаю столбец индикатора в моем DataFrame, чтобы показать, есть ли значение другого столбца в списке.

Моя первая попытка использовала базовый питон в операторе «in», и мой индикатор выполнения показал, что это будетзанять 83 часа, чтобы бежать.Затем я попытался использовать панд ".isin ()", и это заняло менее одной секунды.Мой DataFrame содержит около 40 000 000 строк, а список, в котором я ищу, содержит около 100 000 элементов.Список уже отфильтрован для удаления повторяющихся элементов (lst = list (set (original_list))).Элементы, которые я сравниваю, представляют собой строки длиной около 20 символов.

Вот моя первая попытка (это заняло бы 83 часа):

df['indicator']=df['col1'].progress_apply(lambda x: 1 if x in lst else 0)

Вот моя вторая попытка (которая заняламенее одной секунды):

df['indicator']=df['col1'].isin(tqdm(lst))

Кто-нибудь может объяснить, почему второй приводит к такому радикальному улучшению?Ответ на Почему метод Pandas .isin () быстрее, чем "==" , на самом деле не объясняет это.

1 Ответ

1 голос
/ 25 сентября 2019

Разница между этими двумя методами обусловлена ​​главным образом выполнением операции x in X.Этот тест имеет сложность O(size_of_X), когда X представляет собой список, и O(1), если X представляет собой набор.

Если вы преобразуете lst в set до progress_apply, вы получаете в основном ту же производительность, что и Series.isin

Вот быстрый тест

SERIES = pd.Series([str(i) for i in range(100000)])
LIST = [str(i) for i in range(-10000, 10000)]

%timeit SERIES.isin(LIST)
# 9.2 ms

SERIES.map(lambda x: x in LIST)
# 22000 ms

%timeit SET = set(LIST); SERIES.map(lambda x: x in SET)
# 24.8 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...