假設我們有兩個表,trans并且product. 假設該trans表由用戶購買的超過十億行組成。
我正在嘗試查找同一用戶經常一起購買(在同一日期購買)的配對產品,例如葡萄酒和開瓶器、薯片和啤酒等。
我正在嘗試查找前五名配對產品及其名稱。
trans 和 prod 資料框:-
trans = {'ID':[1,1,2,2,3,3,1,5,5,6,6,6],
'productID':[11,22,11,22,33,77,11,77,88,11,22,77],
'Year':['2022-01-01','2022-01-01','2020-01-05','2020-01-05','2019-01-01','2019-01-01','2020-01-07','2020-01-08',
'2020-01-08','2021-06-01','2021-06-01','2021-06-01']}
trans = pd.DataFrame(trans)
trans['Year'] = pd.to_datetime(trans['Year'])
trans
product = {'productID':[11,22,33,44,55,77,88],
'prodname':['phone','Charger','eaphones','headset','scratchgaurd','pin','cover']}
product = pd.DataFrame(product)
product
到目前為止,我的代碼一直在嘗試對具有相同 ID 和年份的專案進行排名,然后嘗試獲取產品名稱。
transprod = pd.merge(trans,product,on='productID' , how='inner')
transprod
transprod['Rank'] = transprod.groupby('ID')['Year'].rank(method = 'dense').astype(int)
transprod = transprod.sort_values(['ID','productID','Rank'])
transprod
期望的輸出:
Product 1 | Product 2 | Count
phone charger 3
Charger pin 1
eaphones pin 1
pin cover 1
非常感謝任何幫助。提前致謝
uj5u.com熱心網友回復:
您可以按 ID(和日期)對交易表進行分組,并列出每個訂單的所有產品對。itertools.combinations在這里很有用。通過先將集合置于訂單之上,您可以忽略多個相等的專案。
由于一對出現的順序無關緊要,因此您可以構建所有對的平面串列并使用collections.Counter實體來計算它們。首先對每對進行排序可確保您可以忽略一對中專案的順序。
產品表可以轉換成字典,方便查找。這將提供一種將產品名稱添加到結果表中的方法。
from itertools import combinations
from collections import Counter
pairs_by_trans = trans.groupby(['ID', 'Year'])['productID'].agg(
lambda x: list(combinations(set(x), 2)))
pairs_flat = [tuple(sorted(pair)) for row in pairs_by_trans for pair in row]
counts = Counter(pairs_flat)
top_counts = pd.DataFrame(counts.most_common(5),
columns=['pair', 'count'])
prodname = {k: v for k, v in product.values}
top_counts['names'] = top_counts['pair'].apply(lambda x: (prodname[x[0]],
prodname[x[1]]))
top_counts
pair count names
0 (11, 22) 3 (phone, Charger)
1 (33, 77) 1 (eaphones, pin)
2 (77, 88) 1 (pin, cover)
3 (11, 77) 1 (phone, pin)
4 (22, 77) 1 (Charger, pin)
uj5u.com熱心網友回復:
下面的解決方案對我來說非常好
transprod = pd.merge(trans,product,on='productID' , how='inner')
transprod['Rank'] = transprod.groupby('ID')['Year'].rank(method = 'dense').astype(int)
transprod = transprod.sort_values(['ID','productID','Rank'])
def checkprod(x):
v1 = (x['Rank']==x['Rank'].shift(-1))
return (x[v1 | v1.shift(1)])
out = transprod.groupby('ID').apply(checkprod).reset_index(drop=True)
pairs = out.groupby(['ID','Rank'])['prodname'].agg(
lambda x: list(combinations(set(x), 2)))
Counter(list(itertools.chain(*pairs)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409475.html
標籤:
上一篇:為什么str.replace不替換選定熊貓資料框列中的所有值?
下一篇:回圈洗掉熊貓資料框行
