#pandas
#pandas
Вопрос:
У меня есть фрейм данных, где каждая строка имеет определенную активность пользователя:
UserID Purchased
A Laptop
A Food
A Car
B Laptop
B Food
C Food
D Car
Теперь я хочу найти все уникальные комбинации приобретенных продуктов и количество уникальных пользователей для каждой комбинации. Мой набор данных содержит около 8 различных продуктов, поэтому выполнение этого вручную занимает очень много времени. Я хочу, чтобы конечный результат был чем-то вроде:
Number of products Products Unique count of Users
1 Food 1
2 Car 1
2 Laptop,Food 1
3 Car,Laptop,Food 1
Ответ №1:
# updated sample data
d = {'UserID': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'C', 6: 'D', 7: 'C'},
'Purchased': {0: 'Laptop',
1: 'Food',
2: 'Car',
3: 'Laptop',
4: 'Food',
5: 'Food',
6: 'Car',
7: 'Laptop'}}
df = pd.DataFrame(d)
# groupby user id and combine the purchases to a tuple
new_df = df.groupby('UserID').agg(tuple)
# list comprehension to sort your grouped purchases
new_df['Purchased'] = [tuple(sorted(x)) for x in new_df['Purchased']]
# groupby purchases and get then count, which is the number of users for each purchases
final_df = new_df.reset_index().groupby('Purchased').agg('count').reset_index()
# get the len of purchased, which is the number of products in the tuple
final_df['num_of_prod'] = final_df['Purchased'].agg(len)
# rename the columns
final_df = final_df.rename(columns={'UserID': 'user_count'})
Purchased user_count num_of_prod
0 (Car,) 1 1
1 (Car, Food, Laptop) 1 3
2 (Food, Laptop) 2 2
Комментарии:
1. Привет, спасибо за это. Это все еще не соответствует моему требованию, потому что, если человек купил ноутбук и автомобиль, этот человек не должен попадать в категорию «только для ноутбука». Согласно вашему решению, это так. был бы очень признателен, если бы вы могли помочь мне с этим, братан. Спасибо.
2. @Hassaan, я предполагал, что вы хотите все комбинации. Рад обновить ваши примерные данные и ожидаемый результат, чтобы отразить то, что вы ищете.
3. @Chris, я обновил образец данных и ожидал выхода. Мне нужны все возможные комбинации, но мне нужно количество пользователей только для этой конкретной комбинации. В ожидаемом выводе первая строка показывает 1 как уникальное количество, потому что только у 1 пользователя был только 1 продукт, и это «Еда». В вашем решении выше это показало бы 3 как уникальное количество после «Еды»