Поиск последовательности значений в столбце 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'