熊猫中的边缘收缩

时间:2016-03-10 13:24:27

标签: python pandas graph-theory

我在Windows 7上使用Python 2.7

从这个问题:Python networkx : edge contraction我们知道如何使用networkx进行边缘收缩。但是这也可能使用pandas

假设我有dataframe df表示从fld1fld2的有向边,而r_val是该连接的权重。

以下是df定义的网络内容的图片:network

import pandas as pd
df = pd.DataFrame({'fld1': ['a',    'a',    'b',    'c',    'c',    'g',    'd',    'd',    'e',    'e',    'f']
                ,  'fld2': ['b',    'c',    'f',    'd',    'g',    'd',    'e',    'b',    'c',    'f',    'b']
                , 'r_val': [0.1,    0.9,    1,  0.5,    0.5,    1,  0.8,    0.2,    0.2,    0.8,    1]})

df
Out[4]: 
   fld1 fld2  r_val
0     a    b    0.1
1     a    c    0.9
2     b    f    1.0
3     c    d    0.5
4     c    g    0.5
5     g    d    1.0
6     d    e    0.8
7     d    b    0.2
8     e    c    0.2
9     e    f    0.8
10    f    b    1.0

我想收缩r_val等于1的边,使得df变为df2。这意味着,fld1等于fld2 r_val == 1.两个方向r_val == 1的情况(在节点B和节点F的情况下)例如,删除哪个节点无关紧要。

df2 = pd.DataFrame({'fld1': ['a',    'a',  'd',    'd',    'e',    'e'  ]
                ,  'fld2': ['b',    'd',   'e',    'b',    'd',    'b'  ]
                , 'r_val': [0.1,    0.9,   0.8,    0.2,    0.2,    0.8]})

df2
Out[6]: 
  fld1 fld2  r_val
0    a    b    0.1
1    a    d    0.9
2    d    e    0.8
3    d    b    0.2
4    e    d    0.2
5    e    b    0.8

修改

这需要迭代完成,直到不再有r_val等于1.当某些边缘收缩时,它们会产生新的边缘,也可能等于1.

1 个答案:

答案 0 :(得分:1)

不是熊猫巫师,但这是一种似乎有用的方法。

一次迭代;

# Find rows where 'r_val' = 1 and replace its 'fld1' with 'fld2' in 
# the entire frame.
df = df.replace(list(df['fld1'][df['r_val']==1]), list(df['fld2'][df['r_val']==1]))

# Eliminate all edges that have collapsed
df = df[df['fld1'] <> df['fld2']]

# Sum up 'r_val' for all edges with the same 'fld1' and 'fld2'
df = df.groupby(['fld1','fld2'], group_keys=1)['r_val'].sum().reset_index()

使用您的数据运行示例;

Start:

   fld1 fld2  r_val
0     a    b    0.1
1     a    c    0.9
2     b    f    1.0
3     c    d    0.5
4     c    g    0.5
5     g    d    1.0
6     d    e    0.8
7     d    b    0.2
8     e    c    0.2
9     e    f    0.8
10    f    b    1.0

First iteration:

  fld1 fld2  r_val
0    a    b    0.1
1    a    c    0.9
2    c    d    1.0
3    d    b    0.2
4    d    e    0.8
5    e    b    0.8
6    e    c    0.2

Second iteration:

  fld1 fld2  r_val
0    a    b    0.1
1    a    d    0.9
2    d    b    0.2
3    d    e    0.8
4    e    b    0.8
5    e    d    0.2

没有更多的r_val = 1,我们就完成了。