проверить, начинаются ли строковые значения столбца в кадре данных со строковых элементов кортежа (кроме str.startswith) - PullRequest
1 голос
/ 09 октября 2019

У меня есть столбец данных pandas со случайными значениями ("457645","458762496","1113423453"...), и мне нужно проверить, начинаются ли эти значения с элементов кортежа ("323","229","111").

В этом случае это должно быть верно для "1113423453".

Я пробовал df[column].str.startswith(tuple), который отлично работает;но для большого объема данных (строки 2M df и элементы кортежа 3K) он становится намного медленнее (около 28 секунд) по сравнению со строками 10K df и элементами кортежа 3K (1,47 секунды).

Есть ли более эффективныйспособ сделать это?

1 Ответ

0 голосов
/ 15 октября 2019

Я пробовал df[column].str.startswith(tuple), который отлично работает ... но я ищу более эффективный способ сделать это, если это возможно

Так как startswith() не оптимизировандля большого количества строк префикса и выполняет только линейный поиск через них, использование бинарного поиска может быть более эффективным здесь. Для этого нам нужны отсортированные префиксы.

from bisect import bisect_right
s = sorted(tuple)
df[column].apply(lambda str: str.startswith(s[bisect_right(s, str)-1]))

Возможно ли извлечь префикс в новый столбец кадра данных?

Да, например, с этимфункция:

def startwiths(str):
    prefix = s[bisect_right(s, str)-1]
    if str.startswith(prefix): return prefix

df['new column'] = df[column].apply(startwiths)
...