Как мне удалить только популярные товары из покупки и сохранить остальные?

#python #pandas #dataframe

#python #панды #dataframe

Вопрос:

Как мне удалить популярные товары из покупки?

Я хотел бы удалить самые популярные статьи из моего фрейма данных.

Я уже получаю 5 лучших статей. К сожалению, я не знаю, как удалить их из моих отдельных покупок.

Например, покупка содержит один популярный товар и два обычных товара. После очистки популярный элемент должен быть удален, и должно остаться только два элемента.

 import pandas as pd
d = {'purchaseid': [0, 0, 0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 9, 9, 9, 9],
         'itemid': [ 3, 8, 2, 10, 3, 10, 4, 12, 3, 12, 3, 4, 8, 6, 3, 0, 5, 12, 9, 9, 13, 1, 7, 11, 11]}
df = pd.DataFrame(data=d)

print(df.head(5))

print(df['itemid'].nunique())
gb = df.groupby("itemid").size().nlargest(n=5, keep="first")
print(gb) # gives me the popularst items with the count

   purchaseid  itemid
0           0       3
1           0       8
2           0       2
3           1      10
4           2       3

14
# the popularst items
itemid
3     5
12    3
4     2
8     2
9     2
 

Что я хочу после очистки

    purchaseid  itemid
-           -       - # purchase 0 has only 2 instead of 3 purchases
0           0       8 
1           0       2
2           1      10
-           -       - # This line should be completely removed, this is only for illustration.
 

Ответ №1:

Обратите внимание, что идентификаторы наиболее популярных товаров содержатся в индексе gb (левый столбец в списке популярных товаров в вашей выборке данных). Значения gb (правый столбец) содержат только информацию о том, сколько строк содержит df для элементов с определенным itemid .

Итак, чтобы получить «не популярные» товары, вы должны выбрать строки, где itemid отсутствует в gb.index. Наиболее естественным способом получения этого результата является логическое индексирование, основанное только на этом критерии:

 result = df[~df.itemid.isin(gb.index)]
 

Результат:

     purchaseid  itemid
2            0       2
3            1      10
5            2      10
13           5       6
15           6       0
16           6       5
20           8      13
21           9       1
22           9       7
23           9      11
24           9      11
 

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

 0           0       8
 

(0 — index, 0 — purchaseid и 8 — itemid), но я думаю, что это ошибка.
Обратите внимание, что itemid == 8 входит в число 5 самых популярных товаров (их 2).