我在Windows 7上使用Python 2.7
从这个问题:Python networkx : edge contraction我们知道如何使用networkx
进行边缘收缩。但是这也可能使用pandas
?
假设我有dataframe
df
表示从fld1
到fld2
的有向边,而r_val
是该连接的权重。
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.
答案 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,我们就完成了。