使用 pandas groupby 查找每周一起购买的商品组合

Jon*_*nis 9 python combinations pandas

我有一个df

date            category            subcategory         order_id        product_id       branch
2021-05-04      A                   aa                  10              5                web
2021-06-04      A                   dd                  10              2                web
2021-05-06      B                   aa                  18              3                shop
2021-07-06      A                   aa                  50              10               web
2021-07-06      C                   cc                  10              15               web
2021-07-05      A                   ff                  101             30               shop
2021-10-04      D                   aa                  100             15               shop  
Run Code Online (Sandbox Code Playgroud)

我试图回答一个问题:每周按分支类型一起购买哪些商品类别和子类别。我正在考虑将其分组order_ids并聚合category & subcategorylist 如下所示:

a = (df.set_index('date')
     .groupby(['order_id','branch'])
     .resample('W-MON', label = 'left')
     .agg({'category':list, 'subcategory':list}))

Run Code Online (Sandbox Code Playgroud)

返回:

                                                category            subcategory
order_id        branch          date            [A, A, A]           [aa, dd, aa]
10              web             2021-05-04      ...                 ...
18              shop            ...
50              web
100             web
101             shop
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个结构,该结构将显示 的每种变体的频率categoriessubcategories每周购买的频率branch,与此类似:

branch                                  date                        
                                        2021-05-04                      2021-05-011
                                                                        ...
web                  category            3, [A, A, A] 
                                         2, [A, A] 
                                         2, [A, A, B, B]

                     subcategory         5, [aa, dd, aa]
                                         4, [dd, aa]
                                         1, [dd]

shop                 category            3, [A, A, A] 
                                         2, [A, A] 
                                         2, [A, A, B, B]

                     subcategory         5, [aa, dd, aa]
                                         4, [dd, aa]
                                         1, [dd]
Run Code Online (Sandbox Code Playgroud)

其中列表前的数字表示以相同顺序购买categories和的某些组合的次数。subcategories我不确定如何实现这样一种结构或类似的结构,以显示每周的组合频率branch。订单中的顺序product_id并不重要,因为最终的篮子是相同的。

categories, subcategories & product_ids因此,目标是查看每周相同订单的购买频率。因此,如果 2 个不同的订单具有相同的产品,聚合结果将显示2, [A,B] [aa, bb] [5, 2]列表中包含类别、子类别和 Product_id 组合的位置。

Yas*_*dov 5

这就是您所需要的:

import pandas as pd
import numpy as np
from datetime import timedelta
from datetime import datetime as dt

# df=pd.read_excel('demo.xlsx')

df['date']=pd.to_datetime(df['date'])
df['date']=df['date'].dt.strftime('%Y-%m-%d')
df['date']=pd.to_datetime(df['date'])
df['year_week'] = df['date'].dt.strftime('%Y_%U')

df['orderid_year_week']=df['order_id'].astype(str)+'_'+df['year_week']

df=df.sort_values(['category', 'subcategory','product_id'], ascending=[True, True,True])

a = (df.set_index('orderid_year_week')
     .groupby(['year_week','order_id'],sort=False)
     .agg({'category':list, 'subcategory':list,'product_id':list})).reset_index()

a['category'] =a['category'].astype(str)
a['subcategory'] =a['subcategory'].astype(str)
a['product_id'] =a['product_id'].astype(str)

df=pd.pivot_table(a,index=['year_week','category','subcategory','product_id'],values='product_id',aggfunc='count').reset_index()

df.rename({'order_id':'count'},axis=1,inplace=True)

Run Code Online (Sandbox Code Playgroud)

输出如下所示(我在您提供的示例之上添加了更多条目):

在此输入图像描述

您的解释中有些内容不是很清楚。但请告诉我这是否完全回答了您的问题。