簡體   English   中英

熊貓的邊緣收縮

[英]Edge Contraction in Pandas

我在Windows 7上使用Python 2.7

從以下問題開始: Python networkx:邊緣收縮我們知道如何使用networkx進行邊緣收縮。 但是使用pandas也有可能嗎?

假設我有一個dataframe df ,它表示從fld1fld2向邊,而r_val是該連接的權重。

這是df定義的網絡的df 網絡

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM