2012-06-20 5 views
0

그래프에서 어느 쪽 가장자리가 양방향인지를 찾으려고합니다. 각 행은 가장자리입니다. DF [ 'S'] 이제 반복 항목의팬더의 지시 그래프

for ending_point_B in nodeA: 
    nodeA in ending_points_of_B 

무시한 : 그들은 종료점으로 노드 (A)가있는 경우, 각 출발 노드 (A)의 경우, I는 각 해당 엔드 노드 B를 탐색하고있다. 이 검색을 어떻게 최적화 할 수 있습니까? 나는 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) 

이 반환 :

하지 BI : 세트 ([(2, 3)])

다음과 같은 무언가가 당신에게 양방향하지 않는 링크를 제공해야
+0

네, 판다가 필요하지 않았지만 사후 분석을 위해 유용 해졌으며 팬더의 데이터 구조를 더 잘 이해합니다. 지퍼 끝 주셔서 감사합니다. – poeticcapybara

0

감사드립니다. 2와 3이 주어 위의 예에서, 노드의 그러한 쌍, 당신은 할 수있는 다음

In [3]: df[-df.is_bi][['S', 'E']] 
Out[3]: 
    S E 
3 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] 당신에게 양방향하지 않은 모든 노드 쌍을 줄 것이다

나는 이것을 지나치게 복잡하게 만들고 팬더 - 네이티브 함수로이 작업을 수행해야하는 느낌이 들지만, 위의 해결책은 트릭을 수행합니다.

관련 문제