从数据库创建边缘列表和节点的属性列表

From a databaset, create an edgelist and node's attributes list

我有一个包含以下列和观察结果的数据集:

   Source   Target  Label_Source    Label_Target
    E   N   0.0 0.0
    A   B   1.0 1.0
    A   C   1.0 0.0
    A   D   1.0 0.0
    A   N   1.0 0.0
    S   G   0.0 0.0
    S   L   0.0 1.0
    S   C   0.0 0.0

构建数据集的人没有拆分为边缘列表和节点属性,所以现在我有兴趣创建这两个单独的数据集。 我的想法是 select 网络中的唯一节点,并在节点与其对应的标签值之间创建一个映射,请注意 Label_Source 被分配给源节点, Label_Target 被分配给目标节点。两者在网络中没有重叠(至少,不应该有)。 我的预期输出是

  1. 边缘列表(只需删除标签列):

    源目标
    E N
    B
    一个C
    D
    一个 N
    SG
    大号
    SC

  2. 具有属性的节点列表:

     Node    Label
     E          0
     N          0
     A          1
     B          1
     C          0
     D          0
     S          0
     G          0
     L          1
    

能否请您告诉我如何获取创建此映射的节点列表?我想一个选择是 select 来自 Source 和 Target 的不同元素,然后为每个元素查看它们在 Label_source 或目标列中的标签。

让我们尝试拆分然后 groupbymax

out1 = df.filter(like='Source')
out2 = df.filter(like='Target')
out1.columns = ['Node','Label']
out2.columns = ['Node','Label']
out = pd.concat([out1,out2]).groupby('Node').max().reset_index()

  Node  Label
0    A    1.0
1    B    1.0
2    C    0.0
3    D    0.0
4    E    0.0
5    G    0.0
6    L    1.0
7    N    0.0
8    S    0.0

尝试:

edgelist = df[['Source', 'Target']]
nodelist = pd.concat([pd.DataFrame(df.filter(like='Source').to_numpy()),
                      pd.DataFrame(df.filter(like='Target').to_numpy())]) \
             .rename(columns={0: 'Node', 1: 'Label'}).fillna(0) \
             .astype({'Label': int}).drop_duplicates().reset_index(drop=True)

输出:

>>> edgelist
  Source Target
0      E      N
1      A      B
2      A      C
3      A      D
4      A      N
5      S      G
6      S      L
7      S      C

>>> nodelist
  Node  Label
0    E      0
1    A      1
2    S      0
3    N      0
4    B      1
5    C      0
6    D      0
7    G      0
8    L      1