2012-06-20 55 views
0

我想知道圖中哪條邊是雙向的。每一行都是一條邊。對於各開始節點A,我尋找每個對應端節點乙如果它們具有節點A作爲終點:熊貓中的有向圖

for ending_point_B in nodeA: 
    nodeA in ending_points_of_B 

否認在DF [「S」]現在重複條目。我如何優化此搜索?我懷疑沿着groupby的路線。這種方式需要太多時間來處理我的真實圖形。

謝謝

from pandas import * 

def missing_node(node): 
    set1 = set(df[df.E == node].S.values) 
    set2 = set(df.E[df.S == node].values) 
    return list(set1.difference(set2)) 

x = [1,1,2,2,3] 
y = [2,3,1,3,1] 

df = DataFrame([x,y]).T 
df.columns = ['S','E'] #Start & End 

df['Missing'] = df.S.apply(missing_node) 

df: 

    S E Missing 
0 1 2  [] 
1 1 3  [] 
2 2 1  [] 
3 2 3  [] 
4 3 1  [2] 

回答

0

熊貓是偉大的,但不知道你需要在這裏。像下面這樣的東西應該給你,不是雙向鏈接:

x = [1,1,2,2,3] 
y = [2,3,1,3,1] 

fwd = set(zip(x,y)) 
rev = set(zip(y,x)) 
print ' not bi: ', fwd.difference(rev) 

這將返回:

不是雙向:集([(2,3)])

+0

是的,我不需要熊貓,但後驗分析變得有用,只是試圖更好地理解熊貓的數據結構。感謝您的郵編。 – poeticcapybara

0

如果我正確理解你的問題,你需要找到的是不是雙向的所有節點對。在上面的例子中,只有這樣的對節點2和3。鑑於此,你可以做到以下幾點:

In [1]: df['is_bi'] = df.index.map(lambda x: np.any(map(lambda y: np.all(y), df.ix[x][['E', 'S']].values == df.values))) 
In [2]: df 
Out[2]: 
    S E is_bi 
0 1 2 True 
1 1 3 True 
2 2 1 True 
3 2 3 False 
4 3 1 True 

所以df[-df.is_bi]會給你不是雙向節點的所有對:

In [3]: df[-df.is_bi][['S', 'E']] 
Out[3]: 
    S E 
3 2 3 

我有這樣的感覺,我過分複雜這一點,必須有一種方法來做到這一點與熊貓本地功能,但上述解決方案的伎倆。