Поиск последовательности значений в столбце DataFrame

В DataFrame содержаться упорядоченные даннные с путем следования маршрутов:

index  номер_автобуса номер_остановки
    1              73       Алтуфьево
    2              73        Бибирево
    3              73        Отрадное
    4              80        Бибирево
    5              80        Отрадное
    6              90        Отрадное
    7              90        Бибирево

Также есть некий маршрут пользователя.

Задача в том, чтобы отобрать все сонаправленые некоему перечню остановок отрезки маршрутов. Например, для [Алтуфьево, Бибирево, Отрадное] подходят отрезки маршрута 73 и 80.

Как это сделать не прибегая ко множеству вложенных циклов?


Ответы (1 шт):

Автор решения: MaxU

Попробуйте так:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
# искомый маршрут в виде списка
srch_route = "Алтуфьево Бибирево Отрадное".split()
# обучаем LabelEncoder на всех названиях остановок
le.fit(df["номер_остановки"].tolist() + srch_route)
# создаем столбец с закодированным названием остановки    
df["route"] = le.transform(df["номер_остановки"])
# кодируем искомый маршрут
route_points = list(map(str, le.transform(srch_route)))
# создаем закодированные пути поиска
srch_paths = []
for ii in range(len(route_points)-1):
    srch_paths.append("~".join(route_points[ii:]))
srch_pat = "|".join(srch_paths)
# создаем вспомогательный фрейм с закодированными маршрутами автобусов
d = df.groupby("номер_автобуса")["route"].apply(lambda x: x.astype(str).str.cat(sep="~")).reset_index()
# ищем подходящие номера автобусов
res = d.loc[d["route"].str.contains(srch_pat, regex=True), "номер_автобуса"]

результат:

In [61]: res
Out[61]:
0    73
1    80
Name: номер_автобуса, dtype: int64

вспомогательный фрейм:

In [65]: d
Out[65]:
   номер_автобуса  route
0              73  0~1~2
1              80    1~2
2              90    2~1

RegEx для поиска маршрута пользователя с закодированными остановками:

In [66]: srch_pat
Out[66]: '0~1~2|1~2'
→ Ссылка