过滤连接来自不同 类 的节点的边

Filter edges that connect nodes from different classes

数据集,形式为

Source     Target     Source_Class     Target_Class
1          2          1                     0
1          3          1                     0
2          1          0                     1 
4          2          0                     0
5          4          0                     0
5          1          0                     1
3          1          0                     1

用于构建网络,其中Source_Class是Source的属性,Target_Class是Target的属性。 我需要找到 link 两个具有不同 classes 的节点的边,例如 1(具有 class 1)和 2(具有 class 0); 1 和 3,依此类推,即网络中 'connectors' 的边列表,因为它们 link 两个节点具有不同的 classes.

写成上面的样子,问题好像很容易解决,但是我有一个问题就是如何只考虑Source/Target个节点一次。例如,我可以使用逻辑和和 select 仅在 Source_Class(Target_Class) 中具有 0(1) 且在 Target_Class 中具有 1(0) 的行(Source_Class).但是,考虑到网络是无向的,我会有重复。

Source     Target     Source_Class     Target_Class
    1          2          1                     0
    1          3          1                     0
    2          1          0                     1 
    5          1          0                     1
    3          1          0                     1

我的预期输出是:

Source Target  Different 
1        2         1
1        3         1
5        1         1

你知道如何过滤掉重复项吗?

使用 np.sort 来排序 Source/Target 对,然后你可以对其进行分组:

a = np.sort(df[['Source', 'Target']], axis=1)

(df.groupby([a[:,0], a[:,1]]).head(1)
   .reset_index(drop=True)
   .query('Source_Class != Target_Class')
)

输出:

   Source  Target  Source_Class  Target_Class
0       1       2             1             0
1       1       3             1             0
4       5       1             0             1