如何在 2 个数据框中映射和计算项目的出现次数
Posted
技术标签:
【中文标题】如何在 2 个数据框中映射和计算项目的出现次数【英文标题】:how to map and counts items occurrence in 2 Dataframes 【发布时间】:2021-05-10 08:38:59 【问题描述】:我是数据科学的新手,我还在学习,如果我对我的问题的解释不正确,请见谅。
我有 2 个数据框,第一个数据框(项目)显示一些杂货产品名称,它是项目编号,而第二个数据框(交易)显示包含已购买项目的交易编号。
第一个数据帧(项目)=
Item | ProductName |
---|---|
100 | Cheese |
201 | Milk |
302 | egg |
第二个数据帧(交易)
Transaction |
---|
201 100 302 |
100 302 |
201 302 |
我设法拆分交易列并用这段代码分隔它
Transaction=transactions.str.split(' ', expand=True)], axis=1)
DataFrame 变得像
0 | 1 | 2 |
---|---|---|
201 | 100 | 302 |
100 | 302 | None |
201 | 302 | None |
现在我正在努力研究如何同时映射数据帧和一个热函数或 Get_dummies,并计算在 DataFrame(Transaction) 中购买/发生了多少来自 DataFrame (items) 的项目。
我想这样做的原因是因为我试图这样做是为了应用 Apriori 函数来查找购物篮分析的关联规则。
提示。有数据帧被简化,实际数据帧是10,000长度。
非常感谢您的帮助
【问题讨论】:
【参考方案1】:准备好从多列项目更改为单列reshape()
,然后使用value_counts()
获取交易中的项目计数就很简单了。显然,这也可以加入/合并到产品数据框。
dfp = pd.DataFrame('Item': 0: 100, 1: 201, 2: 302,
'ProductName': 0: 'Cheese', 1: 'Milk', 2: 'egg')
dftrans = pd.DataFrame('Transaction': 0: '201 100 302', 1: '100 302', 2: '201 302')
dftrans = dftrans.Transaction.str.split(" ", expand=True)
pd.DataFrame(dftrans.values.reshape(len(dftrans)*len(dftrans.columns),1), columns=["Item"]).value_counts().to_frame().reset_index()
Item | 0 | |
---|---|---|
0 | 302 | 3 |
1 | 100 | 2 |
2 | 201 | 2 |
【讨论】:
【参考方案2】:>>> pd.merge(df1, df2.squeeze().str.split() \
.explode().astype(int) \
.rename("Item"),
on="Item").value_counts().rename("Count").reset_index()
Item ProductName Count
0 302 egg 3
1 201 Milk 2
2 100 Cheese 2
【讨论】:
【参考方案3】:如果您需要一个热编码,您可能需要先融化 trans 数据帧:
dftransnew = pd.melt(dftrans.reset_index(),value_name='Item',id_vars='index').drop(columns='variable')
dftransnew = dftransnew[pd.notnull(dftransnew.Item)] # removing nulls
和 get_dummies 并按交易分组以获取编码的篮子:
dfbasket=pd.get_dummies(dftransnew, prefix="", prefix_sep="" ).groupby('index').sum()
dfbasket
输出:
100 201 302
index
0 1 1 1
1 1 0 1
2 0 1 1
【讨论】:
以上是关于如何在 2 个数据框中映射和计算项目的出现次数的主要内容,如果未能解决你的问题,请参考以下文章