如何在熊猫中建立列之间的关系



我有一个来自LASTFM数据集的数据帧,其中包含列:user_id|friend_id喜欢这样:

uid | fid
346 | 23
355 | 48

我想把用户之间的关系作为第三列(一种邻接向量(,比如:

uid1 | uid2 | friends
23   | 48   | 0
23   | 56   | 0
23   | ..   | 0
23   | 346  | 1
48   | 23   | 0
48   | 56   | 0
48   | ..   | 0
48   | 346  | 0
48   | 355  | 1
23   | ..   | 0
23   | 346  | 1
346  | 23   | 1

我尝试过使用merge、join、lambda,但迄今为止都没有成功。如有任何帮助,我们将不胜感激。

这里的策略分为两步。首先创建UID跨产品数据集,然后附加好友指示符:

通过首先从原始数据集中获取对的并集及其反转,创建UID叉积。我们将创建一个中间数据集friends,稍后我们将使用它来指示哪些UID是朋友:

pairs = df.rename(columns={'uid': 'uid1', 'fid': 'uid2'})
friends = pd.concat([pairs, pairs.rename(columns={'uid1': 'uid2', 'uid2':'uid1'})])
uids = friends.uid1.drop_duplicates().to_frame(name='uid')
uid
0  346
1  355
0   23
1   48

然后,附加一个伪合并键以允许跨产品合并:

uids['dummy_key'] = 1
uids = uids.merge(uids, on='dummy_key', suffixes=('1', '2'))[['uid1', 'uid2']]
uid1  uid2
0    346   346
1    346   355
2    346    23
3    346    48
4    355   346
5    355   355
...

现在,我们在friends数据集上合并,附加一个指示符列,以启动我们的邻接列表:

adj = uids.merge(friends, on=['uid1', 'uid2'], how='left', indicator=True)
uid1  uid2     _merge
0    346   346  left_only
1    346   355  left_only
2    346    23       both
3    346    48  left_only
4    355   346  left_only
5    355   355  left_only
...

最后,我们将_merge指示符编码到friend列中:

adj['friends'] = adj.apply(lambda row: 1 if row['_merge'] == 'both' else 0, axis=1)
adj = adj[['uid1', 'uid2', 'friends']]
uid1  uid2  friends
0    346   346        0
1    346   355        0
2    346    23        1
3    346    48        0
4    355   346        0
5    355   355        0

最新更新