假设我有一个熊猫数据框,如下所示:
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]
但是我对此并不感到骄傲。有想法吗?
答案 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是原始数据帧中不存在的对