создать корзину из Pandas DataFrame - не стандартный набор данных транзакций - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над набором данных, используя панд.Набор данных имеет вид:

user_id product_id

user1 product1

user2 product3

user1 product2

или, может быть, это более понятно:

набор данных = [[user1, product1], [user2, product3], [user1, product2]]

Моя цель - использовать этот набор данных, чтобы составить рекомендации для продуктов, которые следует покупать.Для этого я буду использовать правила ассоциации - алгоритм apriori.

Поскольку у меня нет типичного набора данных транзакций с более чем 1 продуктом , купленным вместе (с тем же идентификатором транзакции), и я могуРаботая только с этим набором данных, я подумал о том, что если пользователь 1 купил продукт 1 и продукт 2, то продукт 1 и продукт 2 будут куплены вместе.

После этого я буду создавать правила, используя алгоритм правил ассоциации / apriori ... но для этого мне нужны данные, которые будут в нем.форма:

data = [[product1, product2], [product2], [product3, product1, product2]]

Поэтому мне нужен мой набор данных вследующая форма:

набор данных = [[user1, product1, product2], [user2, product3]]

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

df.groupby(['user_id'])['product_id']

groupby не может быть применено, потому что я должен применить функцию .. также pivot функция нене работает .. и это единственные, о которых я думал, пытаясь сделать преобразование.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

IIUUC вы можете получить то, что хотите, с pd.crosstab

import pandas as pd
df = pd.DataFrame({'user_id': ['user1', 'user2', 'user1', 'user3', 'user3', 'user1', 'user2'],
                   'product_id': ['milk', 'eggs', 'milk', 'bread', 'butter', 'eggs', 'cheese']})

df1 = pd.crosstab(df.user_id, df.product_id).astype('bool').astype('int')
df1.columns.name=None
df1.index.name=None

df1 теперь:

       bread  butter  cheese  eggs  milk
user1      0       0       0     1     1
user2      0       0       1     1     0
user3      1       1       0     0     0

Если вам нужен этот формат списка, вы можете groupby + apply(list).

df.groupby('user_id').product_id.apply(list)
#user_id
#user1    [milk, milk, eggs]
#user2        [eggs, cheese]
#user3       [bread, butter]
#Name: product_id, dtype: object

Или, если вам не нужны дубликаты:

df.groupby('user_id').product_id.apply(set)
#user_id
#user1       {milk, eggs}
#user2     {cheese, eggs}
#user3    {bread, butter}
#Name: product_id, dtype: object
0 голосов
/ 12 июня 2018

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

# set user_id as index of dataframe
df.set_index('user_id', inplace=True)

dataset=[]
for u in df.index.unique():
    data = df.loc[u]['product_id']
    data = [data] if isinstance(data, str) else data.tolist()
    dataset.append([u]+data)

Вывод:

[['user1', 'product1', 'product2'], ['user2', 'product3']]

дайте мне знать, если это ответит на ваш вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...