从Pandas DataFrame创建篮子-不是标准交易数据集

Sar*_*ata 1 python pandas

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

user_id product_id

用户1产品1

用户2产品3

用户1产品2

也许这更清楚:

数据集= [[user1,product1],[user2,product3],[user1,product2]]

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

由于我没有一个典型的交易数据集,且该交易数据集同时购买了1个以上的产品(在相同的交易ID中),因此我只能使用该数据集,因此我考虑考虑,如果user1购买了产品1和产品2,则该产品1和产品2一起购买。

之后,我将使用关联规则/先验算法来创建规则。但是要做到这一点,我需要将数据包含在中。形式:

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

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

数据集= [[user1,product1,product2],[user2,product3]]

之后,我可以继续进行其他步骤来应用apriori ..一键编码,发现频繁项等。

df.groupby(['user_id'])['product_id']
Run Code Online (Sandbox Code Playgroud)

无法使用groupby,因为我必须应用一个函数..而且透视功能也无法工作..而这些是我在尝试进行转换时唯一想到的一个。

ALo*_*llz 5

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
Run Code Online (Sandbox Code Playgroud)

df1现在是:

       bread  butter  cheese  eggs  milk
user1      0       0       0     1     1
user2      0       0       1     1     0
user3      1       1       0     0     0
Run Code Online (Sandbox Code Playgroud)

如果需要该列表格式,可以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
Run Code Online (Sandbox Code Playgroud)

或者,如果您不关心重复项:

df.groupby('user_id').product_id.apply(set)
#user_id
#user1       {milk, eggs}
#user2     {cheese, eggs}
#user3    {bread, butter}
#Name: product_id, dtype: object
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很棒-我今天也了解到,您可以执行以下`df.groupby('user_id')。product_id.apply(list)`。谢谢你的分享 :) (2认同)