[英]Edge Contraction in Pandas
我在Windows 7上使用Python 2.7
從以下問題開始: Python networkx:邊緣收縮我們知道如何使用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
編輯
這將需要迭代完成,直到不再有等於1的r_val
為止。當某些邊緣收縮時,它們將生成也可能等於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,我們就完成了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.