【问题标题】:How can I build a relation between columns in pandas?如何在 pandas 中的列之间建立关系?
【发布时间】:2020-05-11 12:59:15
【问题描述】:

我有一个来自 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,但到目前为止都没有成功。任何帮助将不胜感激。

【问题讨论】:

  • 分配一个等于一的键后合并
  • 谢谢@YOBEN_S。据我了解,我做了uniques_df = pd.DataFrame(df['fid'].unique(), columns=['uid']) uniques_df['rel'] = ones['rel'] # only 1s df2 = df.merge(uniques_df, on='uid', how='outer', suffixes=('', '2')) df2.head() 我之前尝试过类似的东西,但我还必须在字段不相关的地方使用零,并且我必须拥有所有 uid 组合(如叉积)。

标签: python pandas python-3.7 last.fm knowledge-graph


【解决方案1】:

这里的策略是两步。先创建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
...

现在,我们合并朋友数据集,附加一个指示列,开始我们的邻接列表:

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

【讨论】:

  • 非常感谢@Dave 它有效,我能理解!唯一的小问题是 Collab RAM 不足以容纳 uids = uids.merge(uids, on='dummy_key', suffixes=('1', '2'))[['uid1', 'uid2']] 行。但我可以应付。再次感谢。
  • 乐于助人!像这样的交叉产品非常昂贵。如果您想要邻接矩阵,请考虑使用 numpy 稀疏矩阵:docs.scipy.org/doc/scipy/reference/sparse.html
  • 再次感谢。我会的!
猜你喜欢
  • 2023-03-18
  • 2017-11-19
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多