Сложной цикл или функция
Не знаю как правильно реализовать сложную задачу цикл. Задача общими словами то: ищем сессии с событием А, выделяем все события с сессиями С ищем позицию события А в сессии С ищем событие Б после позиции события А нашли событие Б – записали У меня есть два датафрейма.
В одном лежать id сессий df1
sessionId
668 bcd153f8-6c76-4d57-ae96-8c8c79c3238e
3785 6b188d67-b5a0-4986-907e-6f49cfb63d73
5650 62555187-2dae-47fd-9a51-f462b369b994
14846 8b7b3f23-cf5b-43f1-bb41-eb2c9cbfda22
26955 6a831820-582b-498b-832e-f3aa29709491
Второй Dataframe со всеми событиями(общий)
df2
Нужно отфильтровать df2 по id session

Далее найти событие,например (event=searchButton and text==qr) из отфильтрованного df и взять данные которые произошли после нашего события не включая его.
Эти события нужно запихнуть в отдельный Dataframe5.
И проделать это события с каждой сессией из df1 и объединять с предыдущем выводом.
На выходе должен получиться один объединённый dataframe5.
В ручную я могу это сделать, но таблица большая и на одну таблицу уйдет месяц. Помогите автоматизировать процесс. Я пробовал написать цикл. Но он не работает.
i= []
for index, row in df1.itertuples(): #Берем все сессии df1 и прогоняем через общий df2
print(row)
for pps in row: # выводим из df2 все события с конкретным idses
if pss['sessionId']=='044844f0-0e36-4db1-8104-011690bf08cf': #
print(pss['sessionId'])
for ttr in for: # выводим только те события которые произошли после нужно действия
if text==quizFind # Тут мне нужно взять все сессии после события и поместить их в отдельный df3
i.append(ttr)
И так пройтись по каждой сесии из df1.
Ответы (1 шт):
Ваша задача описана очень непонятно. Накидал тут код который как мне кажется облегчит вам задачу.
import pandas as pd
sessions_df = pd.read_csv("stackOverflow/sessionsSort/session.csv")
data_df = pd.read_csv("stackOverflow/sessionsSort/file1.csv")
# Фильтруем данные, что бы не обрабатывать не нужные
filtered_df = data_df[data_df["sessionId"].isin(sessions_df["sessionId"].unique())]
# Группируем данные что бы работать с каждой сессией отдельно
grouped_data = filtered_df.groupby("sessionId")
def search_data(event: str, text: str, df: pd.DataFrame):
# Эта функция ищет нужные ивенты
df = df.reset_index(drop=True)
# содержит строки с нужными ивентами
filtered = df[df.apply(lambda x: x['event'] == event and x['text'] == text, axis=1)]
print(f"Найдено событий: {filtered.shape[0]}")
# дальше можно сохранять и как то обрабатывать датафрейм.
# Итерируемся по датафреймам.
# Здесь item[0] это sessionId а item[1] это датафрейм с данными по этой сессии.
for item in grouped_data:
print(f"processing sessionId: {item[0]}")
# Можно либо сохранить датафрейм или использовать доп функцию что бы как то обработать его.
search_data("searchButton", "qr", item[1])
Пути к файлам только замените на свои.
Это скелет, если не понятно что делать то давайте разделим вашу задачу на несколько частей что бы можно было это имплементировать.
И постарайтесь в описании задачи использовать говорящие названия.
Так же потратьте время на структурное описание алгоритма.
Например:
Имеется:
- data_df - датафрейм с сессиями (файл file1.csv)
- sessions_df - датафрейм с сессиями которые необходимо обработать (файл session.csv)
- Нужно отфильтровать данные из data_df. Нужны только строки в которых колонка sessionId совпадает с одним из sessionId указанных в sessions_df.
- Поместить строки соответствующие одному sessionId в отдельный датафрейм для каждого sessionId
- и так далее.