不在邻接表中的N个边的示例

时间:2018-07-26 15:40:16

标签: python pandas

假设我有一个熊猫数据框,如下所示:

   user_id  item_id
0   697226     2888
1   188374     5718
2   840786     2498
3   408107      265
4   108218     6081

可以将行视为用户和项目之间的关系。因此,我想对我的数据框中不存在的N个关系进行采样。

我正在遵循一种贪婪的方法:

pairs = set([(row.user_id, row.item_id) for i, row in dataset.iterrows()])

i = 0
while i <= train_samples:
    amigo = random.randint(0, n_amigos)
    item = random.randint(0, n_clothes)

    if (amigo, item) not in pairs:
        pairs.add((amigo, item))
        i +=1
        dataset.loc[train_samples+i] = [amigo, item]

但是我对此并不感到骄傲。有想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用pd.MultiIndex.from_product在新数据框中创建所有可能的组合,然后drop使用df中已经存在的组合。然后reset_index将值作为列:

df_combi = (pd.DataFrame(index=pd.MultiIndex.from_product([df.user_id,df.item_id], 
                                                          names=['user_id','item_id']))
              .drop(df.set_index(['user_id','item_id']).index).reset_index())

并输入以下内容即可得到df_combi.head()

   user_id  item_id
0   697226     5718
1   697226     2498
2   697226      265
3   697226     6081
4   188374     2888

现在,如果要在此数据框中添加N行,则可以使用sample

N = 4
print (df_combi.sample(N))
Out[109]: 
    user_id  item_id
4    188374     2888
15   408107     6081
1    697226     2498
8    840786     2888

因此,要将其添加到以前的数据框中,您可以使用pd.concat做:

df = pd.concat([df,df_combi.sample(N)],ignore_index=True) 

您将获得df

    user_id  item_id
0    697226     2888
1    188374     5718
2    840786     2498
3    408107      265
4    108218     6081
5    408107     6081
6    188374     2498
7    840786     2888
8    697226     6081

其中行索引5到8是原始数据帧中不存在的对