Skip to main content
 首页 » 编程设计

python之从 Pandas DataFrame 创建一个篮子——不是标准的交易数据集

2025年05月04日19jillzhang

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

user_id product_id

user1 product1

user2 product3

user1 product2

或者这可能更清楚:

dataset=[[user1,product1], [user2,product3], [user1,product2]]

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

由于我没有包含超过 1 个产品一起购买(在同一交易 ID 中)的典型交易数据集,而且我只能使用该数据集,所以我考虑过如果user1 购买了产品 1 和产品 2,然后产品 1 和产品 2 一起购买。

之后,我将使用关联规则/先验算法创建规则。但为此我需要将数据放在 .的形式:

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

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

dataset=[[user1,product1,product2],[user2,product3]]

之后,我可以继续采取进一步的步骤来应用 apriori.. one-hot 编码、发现频繁项等。

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

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

请您参考如下方法:

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