Найдите и распечатайте все строки, подэлементы которых имеют похожие значения

#python #pandas #algorithm #numpy #data-cleaning

#python #pandas #алгоритм #numpy #очистка данных

Вопрос:

Мой набор данных содержит следующие поля:

 User        Product          Time
 A            10            10-JAN
 B            14            10-JAN
 C            20            10-JAN
 A            12            10-JAN
 B            12            11-JAN
 A            10            12-JAN
 D            08            12-JAN
 A            13            12-JAN
 B            14            13-JAN
 C            20            13-JAN
 A            12            14-JAN
 C            21            14-JAN
 A            10            15-JAN
  

и так далее

Я хочу извлечь и отобразить только тех пользователей, которые ранее покупали аналогичный продукт, с отметкой времени покупки. Итак, что-то вроде этого:

 ProductBought      User     Time           count
    10              A        10-JAN          3
    10              A        12-JAN          3
    10              A        15-JAN          3
    12              A        10-JAN          2
    12              A        14-JAN          2
    14              B        10-JAN          2
    14              B        13-JAN          2
    20              C        10-JAN          2
    20              C        13-JAN          2
  

и так далее.

Я попытался использовать функцию shift следующим образом

 df.sort_values(by=['User','Time'],ascending=True)    
df[(df.User==df.User.shift())amp;(df.productBought==df.productBought.shift()]
  

но я не получаю все результаты, используя это. Например, фиксируются только последовательные результаты, которые имеют одинаковый продукт. В нашем случае, поскольку до того, как пользователь A снова купил 10, он купил 12, поэтому это не фиксируется.
Кроме того, если есть две последовательные записи одного и того же пользователя, имеющего один и тот же продукт, отображается последняя из них, как

df==df.shift()

отображается только запись, которая была обнаружена последней, а не все записи, которые имеют одинаковый продукт. Есть ли какой-либо способ добиться того, что я показал выше?

Комментарии:

1. Как насчет использования groupby? Вы могли бы вызвать groupby([‘Time’,’User’, ’Product’])

Ответ №1:

Вы можете использовать duplicated для получения строк, в которых дублируется пара product-user, т. е. пользователь покупал продукт раньше.

 df2 = df[df.duplicated(['Product', 'User'], keep=False)]
  

Затем вы можете выполнить сортировку и т.д…

Чтобы узнать, сколько раз покупаются продукты, вы можете использовать

 df2.groupby(['Product', 'User']).count()
  

Комментарии:

1. можем ли мы также узнать, сколько раз был куплен продукт?

2. Вы можете использовать groupby и count. Ответ обновлен выше.

3. Да, я понял это.

4. Спасибо, Тим! Это было полезно