我有一个用户 - 项目组合的数据框。
user item
0 user1 item1
1 user1 item2
2 user1 item3
3 user2 item1
4 user2 item4
5 user3 item1
6 user3 item2
7 user3 item4
我想要做的是获得共享相同用户的项目的边缘列表(更简单)或两个项目共享同一用户的频率(更复杂)的共现矩阵。更清楚的是,共现矩阵将显示两个项目一起购买的频率。
以下是边缘列表
的示例 pair1 pair2
0 item1 item2
1 item2 item3
2 item3 item1
3 item1 item4
4 item1 item4
5 item1 item2
6 item2 item4
共生矩阵
item1 item2 item3 item4
item1 5 2 1 2
item2 2 4 1 1
item3 1 1 2 0
item4 2 1 0 3
答案 0 :(得分:1)
我们可以使用?? i want
生成边缘列表
groupby/apply
为每个组生成所有对。
要生成共生矩阵,我们可以先使用itertools.combinations
来开始
计算频率表。由于这个结果是上三角形和所需的
矩阵是对称的,我们可以添加它的转置使其对称。该
对角线似乎是每行中其他项目的总和。填写这些
使用pandas的值需要for循环。或者,我们可以修改
底层的NumPy数组,然后从这个修改过的数组重建DataFrame。
pd.crosstab
产量
import itertools as IT
import numpy as np
import pandas as pd
df = pd.DataFrame({
'item': ['item1', 'item2', 'item3', 'item1', 'item4', 'item1', 'item2', 'item4'],
'user': ['user1', 'user1', 'user1', 'user2', 'user2', 'user3', 'user3', 'user3']})
edges = df.groupby(['user'], group_keys=False).apply(
lambda x: pd.DataFrame(list(IT.combinations(x['item'], 2)),
columns=['first', 'second'])).reset_index(drop=True)
print(edges)
first second
0 item1 item2
1 item1 item3
2 item2 item3
3 item1 item4
4 item1 item2
5 item1 item4
6 item2 item4
产量
cooccurrence = pd.crosstab(index=[edges['first']], columns=[edges['second']])
items = df['item'].unique()
cooccurrence = cooccurrence.reindex(index=items, columns=items)
cooccurrence = cooccurrence.add(cooccurrence.T, fill_value=0)
cooccurrence = cooccurrence.fillna(0)
diagvals = cooccurrence.sum(axis=0)
arr = cooccurrence.values
i = np.arange(len(diagvals))
arr[i,i] = diagvals
cooccurrence = pd.DataFrame(arr, columns=cooccurrence.columns,
index=cooccurrence.index)
print(cooccurrence)
答案 1 :(得分:0)
我对边列表并不太熟悉,但看起来你所做的就是将原始数据帧的item列链接到新数据帧的行中。对于边缘列表,您可以尝试遍历项目列,并将链接的每个元素写入新数据框的新行。也许用于迭代的嵌套for循环可以工作。
对于共生矩阵,您可以使用pandas.cut来分组数据并获得每个项目共同出现的频率分布列表。然后用每个频率填充一个数组。
我暂时没有使用过熊猫,但我会看到我能为代码解决方案做些什么。