从 Pandas 数据帧创建购物篮 - 而不是标准交易数据集



我正在使用熊猫处理数据集。数据集的格式为:

user_id product_id

用户 1 产品1

用户2 产品3

用户 1 产品2

或者也许这更清楚:

数据集=[[用户1,产品1], [用户 2,产品 3], [用户 1,产品 2]]

我的目标是使用此数据集为要购买的产品提供建议。我将使用关联规则 - 先验算法。

由于我没有一个典型的交易数据集,其中有超过 1 个产品一起购买(在同一交易 ID 中(,并且我只能使用该数据集,因此我考虑考虑如果用户 1 购买了产品 1 和产品 2,那么产品 1 和产品 2 一起购买。

之后,我将使用关联规则/先验算法创建规则......但要做到这一点,我需要数据采用 .

的形式为 :

数据=[[产品 1,产品 2]

, [产品 2], [产品 3, 产品 1, 产品 2]]

所以我需要以下形式的数据集:

数据集=[[用户 1,产品 1,产品 2],

[用户 2,产品 3]]

之后,我可以继续进一步的步骤来应用先验..独热编码,发现频繁的项目等。

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

groupby无法应用,因为我必须应用一个函数......也枢函数不起作用......这些是我在尝试进行转换时唯一想到的。

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

这可能不是最好的解决方案 - 也许更有经验的人可以提供适当的熊猫解决方案。我设法通过执行以下操作实现了您需要的输出:

# 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']]

让我知道这是否回答了您的问题:)

最新更新