2012-06-20 3 views
0

Я пытаюсь выяснить, какие ребра из графика двунаправлены. Каждая строка - это ребро. Для каждого исходного узла А, я ищу каждый соответствующий конечный узел B, если они имеют узел А в качестве конечной точки:Направленный граф в pandas

for ending_point_B in nodeA: 
    nodeA in ending_points_of_B 

Игнорирование для повторных записей в настоящее время в ЦФ [ «S»]. Как я могу оптимизировать этот поиск? Я подозреваю что-то в строю группы. Этот путь занимает слишком много времени для моего реального графика.

Спасибо

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

Pandas отлично, но не уверен, что он вам нужен. Что-то вроде следующего должно дать вам ссылки, которые не являются двунаправленными:

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

Да, мне не нужны панды, но для последующего анализа это стало полезным и просто пыталось лучше понять структуры данных pandas. Спасибо за подсказку. – 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 

У меня такое ощущение, что я слишком усложнил это, и должен быть способ сделать это с помощью функций, основанных на пандах, но вышеупомянутое решение делает трюк.

Смежные вопросы