#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).