Pandas组合了共享关联的行

时间:2015-07-10 02:03:06

标签: python matrix pandas

我有一个用户 - 项目组合的数据框。

    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

2 个答案:

答案 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来分组数据并获得每个项目共同出现的频率分布列表。然后用每个频率填充一个数组。

我暂时没有使用过熊猫,但我会看到我能为代码解决方案做些什么。