Получите уникальные значения столбца между временным периодом в пандах после группового - PullRequest
0 голосов
/ 04 декабря 2018

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

Мой подход заключается в том, что я зациклился бы в этом фрейме данных groupby, а затем я бы нашел все индексы в этом фрейме данных этой группы.а затем я бы создал новый фрейм данных от времени индекса до индекса + 60 минут, а затем нашел в нем уникальные значения merchant_store_id.Если уникальный идентификатор merchant_store_id равен> 1, я бы добавил этот фрейм данных с того времени в окончательный фрейм данных.Проблема с подходом в том, что он отлично работает для небольших данных, но для данных размером 20 000 строк показывает ошибку памяти в Linux и продолжает работать в Windows.Ниже приведен мой код

fi_df = pd.DataFrame()
for i in df.groupby(["stamp_card_id", "merchant_id", "user_id"]):
    user_df = i[1]
    if len(user_df)>1:
        # get list of unique indexes in that groupby df
        index = user_df.index.values
        for ind in index:
            fdf = user_df[ind:ind+np.timedelta64(1, 'h')]
            if len(fdf.merchant_store_id.unique())>1:
                fi_df=fi_df.append(fdf)
fi_df.drop_duplicates(keep="first").to_csv(csv_export_path)

Пример данных после группировки по:

((117, 209, 'oZOfOgAgnO'),     stamp_card_id          stamp_time  stamps_record_id     user_id  \
0             117 2018-10-14 16:48:03              1756  oZOfOgAgnO   
1             117 2018-10-14 16:54:03              1759  oZOfOgAgnO   
2             117 2018-10-14 16:58:03              1760  oZOfOgAgnO   
3             117 2018-10-14 17:48:03              1763  oZOfOgAgnO   
4             117 2018-10-14 18:48:03              1765  oZOfOgAgnO   
5             117 2018-10-14 19:48:03              1767  oZOfOgAgnO   
6             117 2018-10-14 20:48:03              1769  oZOfOgAgnO   
7             117 2018-10-14 21:48:03              1771  oZOfOgAgnO   
8             117 2018-10-15 22:48:03              1773  oZOfOgAgnO   
9             117 2018-10-15 23:08:03              1774  oZOfOgAgnO   
10            117 2018-10-15 23:34:03              1777  oZOfOgAgnO   

    merchant_id  merchant_store_id  
0           209                662  
1           209                662  
2           209                662  
3           209                662  
4           209                662  
5           209                662  
6           209                663  
7           209                664  
8           209                662  
9           209                664  
10          209                663  )

Я также пробовал метод повторной выборки, но затем я получаю данные в соответствующее время, гдеусловие, когда пользователь нажимает несколько элементов merchant_store_id, игнорируется в конечное время часов.

Любая помощь будет оценена.Спасибо

1 Ответ

0 голосов
/ 04 декабря 2018

если это даты и время, вы можете фильтровать следующее:

filtered_set = set(df[df["stamp_time"]>=x][df["stamp_time"]<=y]["col of interest"])

df[df["stamp_time"]>=x] фильтрует добавление df [df["stamp_time"]<=y] фильтрует отфильтрованный df ["merchant_store_id"] захватывает только указанный столбец (серию) и, наконец,set() возвращает уникальный список (набор)


Специфично для вашего кода:

x = datetime(lowerbound) #pseudo-code
y = datetime(upperbound) #pseudo-code
filtered_set = set(fi_df[fi_df["stamp_time"]>=x][fi_df["stamp_time"]<=y]["col of interest"])
...